MnZn刚学珂学,请问为什么会WA on #3?
查看原帖
MnZn刚学珂学,请问为什么会WA on #3?
134519
qwq自动机楼主2021/8/18 11:02

RT,调了一个早上了/kk但是总是WA #3。

样例都过了qwq。

所以有dalao能和我说说哪里写挂了吗/kel

#include <algorithm>
#include <iostream>
#include <vector>
#include <set>
#define sit set<node>::iterator
using std::cin;
using std::cout;
using std::pair;
using std::set;
using std::sort;
using std::vector;
typedef long long ll;
struct node
{
    ll l, r;
    mutable ll val;
    node(ll l, ll r = 0, ll val = 0) : l(l), r(r), val(val) {}
    bool operator<(const node &n) const { return l < n.l; }
};
struct rank
{
    ll num;
    ll cnt;
    bool operator<(const rank &r) const { return num < r.num; }
    rank(const node &n) : num(n.val), cnt(n.r - n.l + 1) {}
};
set<node> s;
inline ll qpow(ll b, ll p, ll m)
{
    ll ans = 1;
    while (p)
    {
        if (p & 1)
            ans = ans * b % m;
        b = b * b % m;
        p >>= 1;
    }
    return ans % m;
}
sit split(ll pos)
{
    sit it = s.lower_bound(node(pos));
    if (it != s.end() && it->l == pos)
        return it;
    it--;
    if (it->r < pos)
        return s.end();
    ll l = it->l, r = it->r;
    ll val = it->val;
    s.erase(it);
    s.insert(node(l, pos - 1, val));
    return s.insert(node(pos, r, val)).first;
}
void assign(ll l, ll r, ll val)
{
    sit left, right;
    right = split(r + 1);
    left = split(l);
    s.erase(left, right);
    s.insert(node(l, r, val));
}
void add(ll l, ll r, ll val)
{
    sit left, right;
    right = split(r + 1);
    left = split(l);
    for (sit it = left; it != right; it++)
        it->val += val;
}
ll val(ll l, ll r, ll rnk)
{
    sit left, right;
    right = split(r + 1);
    left = split(l);
    vector<rank> vec;
    vec.clear();
    for (sit it = left; it != right; it++)
        vec.push_back(rank(*it));
    sort(vec.begin(), vec.end());
    for (vector<rank>::iterator it = vec.begin(); it != vec.end(); it++)
    {
        if (it->cnt < rnk)
            rnk -= it->cnt;
        else
            return it->num;
    }
    return vec.end()->num;
}
ll powsum(ll l, ll r, ll pow, ll mod)
{
    ll res = 0;
    sit left, right;
    right = split(r + 1);
    left = split(l);
    for (sit it = left; it != right; it++)
        res = (res + (it->r - it->l + 1) * qpow(it->val, pow, mod) % mod) % mod;
    return res;
}
ll seed, vmax;
inline ll rnd()
{
    ll ret = seed;
    seed = (seed * 7 + 13) % 1000000007;
    return ret;
}
ll n, m;
signed main()
{
    cin >> n >> m >> seed >> vmax;
    for (ll i = 1; i <= n; i++)
        s.insert(node(i, i, (rnd() % vmax) + 1));
    for (ll i = 1; i <= m; i++)
    {
        ll op, l, r, x, y;
        op = (rnd() % 4) + 1;
        l = (rnd() % n) + 1;
        r = (rnd() % n) + 1;
        if (l > r)
            std::swap(l, r);
        if (op == 3)
            x = (rnd() % (r - l + 1)) + 1;
        else
            x = (rnd() % vmax) + 1;
        if (op == 4)
            y = (rnd() % vmax) + 1;
        // std::cout << op << ' ' << l << ' ' << r << ' ' << x << ' ' << y << '\n';
        switch (op)
        {
        case 1:
            add(l, r, x);
            break;
        case 2:
            assign(l, r, x);
            break;
        case 3:
            cout << val(l, r, x) << '\n';
            break;
        case 4:
            cout << powsum(l, r, x, y) << '\n';
            break;
        default:
            std::cerr << "DLLXL!!\n";
            return -1;
            break;
        }
    }
    return 0;
}
2021/8/18 11:02
加载中...