珂朵莉树板题CF896C求条,样例2第三行总是输出12,玄关
查看原帖
珂朵莉树板题CF896C求条,样例2第三行总是输出12,玄关
833737
Lyw_and_Segment_Tree楼主2024/9/26 22:11

rt, code :

#include <bits/stdc++.h>
#define ll long long
#define endl "\n"
using namespace std;
const ll mod = 1e9 + 7;
ll n, m, seed, vmax;
struct node {
    ll l, r; mutable ll v;
    node (ll L, ll R = -1, ll V = 0) {
        l = L, r = R, v = V;
    }
    friend bool operator < (node x, node y) {
        return x.l < y.l;
    }
}; set<node> odt;
ll qpow(ll a, ll b, ll mod) {
    ll ans = 1; a %= mod;
    while (b) {
        if (b & 1) {
            ans = ans * a % mod;
        }
        a = a % mod * a % mod % mod;
        b >>= 1;
    }
    return ans;
}
set<node>::iterator split(ll x) {
    set<node>::iterator it = odt.lower_bound(node(x));
    if (it != odt.end() && it -> l == x) return it; 
    it --;
    ll l = it -> l, r = it -> r, v = it -> v;
    odt.erase(it); odt.insert(node(l, x - 1, v));
    return odt.insert(node(x, r, v)).first;
}
void modify(ll l, ll r, ll V) {
    set<node>::iterator itr = split(r + 1), itl = split(l);
    for (; itl != itr; itl ++) {
        itl -> v += V;
    }
}
void assign(ll l, ll r, ll V) {
    set<node>::iterator itr = split(r + 1), itl = split(l);
    odt.erase(itl, itr); odt.insert(node(l, r, V));
}
ll kth(ll l, ll r, ll k) {
    vector< pair<ll, ll> > tmp; set<node>::iterator itr = split(r + 1), itl = split(l);
    tmp.clear();
    for (; itl != itr; itl ++) {
        tmp.push_back(pair<ll, ll>(itl -> v, ((itl -> r) - (itl -> l) + 1)));
    }
    sort(tmp.begin(), tmp.end());
    for(vector< pair<ll, ll> >::iterator it = tmp.begin(); it != tmp.end(); it ++) {
        k -= it -> second;
        if (k <= 0) return it -> first;
    }
    return -1;
}
ll sum(ll l, ll r, ll k, ll mod) {
    ll res = 0; set<node>::iterator itr = split(r + 1), itl = split(l);
    for (; itl != itr; itl ++) {
        res += (((itl -> r) - (itl -> l) + 1) * qpow(itl -> v, k, mod) + mod) % mod;
    }
    return res;
}
ll rnd() {
    ll res = seed;
    seed = (seed * 7 + 13) % mod;
    return res;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    cin >> n >> m >> seed >> vmax;
    for (ll i = 1, x; i <= n; i++) {
        x = (rnd() % vmax) + 1;
        odt.insert(node(i, i, x));
    }
    odt.insert(node(n + 1, n + 1, 0));
    while (m--) {
        ll op = (rnd() % 4) + 1, l = (rnd() % n) + 1, r = (rnd() % n) + 1, x = 0, y = 0;
        if (l > r) {
            swap(l, r);
        }
        if (op == 3) {
            x = (rnd() % (r - l + 1)) + 1;
        } else {
            x = (rnd() % vmax) + 1;
        }
        if (op == 4) {
            y = (rnd() % vmax) + 1;
        }
        if (op == 1) {
            modify(l, r, x);
        } else if (op == 2) {
            assign(l, r, x);
        } else if (op == 3) {
            cout << kth(l, r, x) << endl;
        } else {
            cout << sum(l, r, x, y) << endl;
        }
    }
}

感觉自己没写错,但是就是似了 qwq

2024/9/26 22:11
加载中...