FHQ全WA,求大佬帮忙看看/jk
查看原帖
FHQ全WA,求大佬帮忙看看/jk
217577
kemkra楼主2021/1/27 11:52
#include <cstdio>
#include <cstdlib>
#include <ctime>

typedef long long ll;

const int N = 200005 * 50;

bool rev[N];
ll a, b, last, v[N], w[N], s[N];
int sz[N], ch[N][2], root[N];
int n, l, m, r, tot;

int newnode(ll x) {
    tot++;
    v[tot] = s[tot] = x;
    w[tot] = rand();
    sz[tot] = 1;
    return tot;
}

int clone(ll x) {
    v[++tot] = v[x];
    w[tot] = w[x];
    s[tot] = s[x];
    sz[tot] = sz[x];
    ch[tot][0] = ch[x][0];
    ch[tot][1] = ch[x][1];
    return tot;
}

void pushup(int x) {
    sz[x] = sz[ch[x][0]] + sz[ch[x][1]] + 1;
    s[x] = s[ch[x][0]] + s[ch[x][1]] + v[x];
}

void pushdown(int x) {
    if (!rev[x]) return;
    if (ch[x][0]) ch[x][0] = clone(ch[x][0]);
    if (ch[x][1]) ch[x][1] = clone(ch[x][1]);
    int tmp = ch[x][0];
    ch[x][0] = ch[x][1];
    ch[x][1] = tmp;
    if (ch[x][0]) rev[ch[x][0]] ^= 1;
    if (ch[x][1]) rev[ch[x][1]] ^= 1;
    rev[x] = 0;
}

int merge(int l, int r) {
    if (!l || !r) return l + r;
    if (w[l] < w[r]) {
        pushdown(l);
        ch[l][1] = merge(ch[l][1], r);
        pushup(l);
        return l;
    }
    pushdown(r);
    ch[r][0] = merge(l, ch[r][0]);
    pushup(r);
    return r;
}

void split(int rt, int k, int &l, int &r) {
    if (!rt) l = r = 0;
    else {
        pushdown(rt);
        if (k <= sz[ch[rt][0]]) {
            r = clone(rt);
            split(ch[rt][0], k, l, ch[r][0]);
            pushup(r);
        } else {
            l = clone(rt);
            split(ch[rt][1], k - sz[ch[rt][0]] - 1, ch[l][1], r);
            pushup(l);
        }
    }
}

void insert(int &rt, int p, ll x) {
    split(rt, p, l, r);
    rt = merge(merge(l, newnode(x)), r);
}

void remove(int &rt, ll p) {
    split(rt, p, l, r);
    split(r, p + 1, m, r);
    m = merge(ch[m][0], ch[m][1]);
    rt = merge(merge(l, m), r);
}

void reverse(int &rt, int a, int b) {
    split(rt, b, l, r);
    split(l, a - 1, l, m);
    rev[m] ^= 1;
    rt = merge(merge(l, m), r);
}

ll query(int &rt, int a, int b) {
    split(rt, b, l, r);
    split(l, a - 1, l, m);
    int sum = s[m];
    rt = merge(merge(l, m), r);
    return sum;
}

int main() {
//  freopen("P5055_1.in", "r", stdin);
    srand(0);
    scanf("%d", &n);
    for (int i = 1, v, opt; i <= n; i++) {
        scanf("%d%d%lld", &v, &opt, &a);
        root[i] = root[v];
        a ^= last;
        if (opt == 1) {
            scanf("%lld", &b);
            b ^= last;
            insert(root[i], a, b);
        }
        if (opt == 2) remove(root[i], a);
        if (opt == 3) {
            scanf("%lld", &b);
            b ^= last;
            reverse(root[i], a, b);
        }
        if (opt == 4) {
            scanf("%lld", &b);
            b ^= last;
            last = query(root[i], a, b);
            printf("%lld\n", last);
        }
    }
    return 0;
}

2021/1/27 11:52
加载中...