关于 FHQ_Treap 的一点问题
查看原帖
关于 FHQ_Treap 的一点问题
375030
CG__HeavenHealer楼主2021/8/15 22:26

我的输出都比答案的输出少好多行,但是输出出来的那几行都是正确的,怀疑是哪里的边界判出了问题,实在是找不出来了,能不能有大佬帮忙看看啊 /kk

Code:

#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define ri register int
const int N = 5e5 + 5, INF = 1e9;
inline int read() {
    ri x = 0, f = 1;
    char c = getchar();
    for (; !isdigit(c); c = getchar()) f = (c == '-') ? -1 : 1;
    for (; isdigit(c); c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
    return f * x;
}
stack<int> stk;
int n, m, a, b, c;
namespace FHQ_Treap {
    struct Tree {
        int val, dat, siz, ch[2];
        int rev, tag, sum, maxx, lm, rm, cov;
    } t[N];
    int rt, tot;
#define ls(x) t[x].ch[0]
#define rs(x) t[x].ch[1]
    inline int New(int val) {
        int x;
        if (stk.size()) {
            x = stk.top();
            stk.pop();
        } else
            x = ++tot;
        t[x].sum = t[x].maxx = t[x].val = val;
        ls(x) = rs(x) = 0;
        t[x].lm = t[x].rm = max(0, val);
        t[x].dat = rand(), t[x].siz = 1;
        t[x].cov = -INF, t[x].tag = 0, t[x].rev = 0;
        return x;
    }
    inline void push_up(int x) {
        if (!x) return;
        t[x].sum = t[x].val + t[ls(x)].sum + t[rs(x)].sum;
        t[x].siz = t[ls(x)].siz + t[rs(x)].siz + 1;
        t[x].maxx = max(max(t[ls(x)].maxx, t[rs(x)].maxx),
                        t[ls(x)].rm + t[x].val + t[rs(x)].lm);
        t[x].lm = max(t[ls(x)].lm, t[ls(x)].sum + t[x].val + t[rs(x)].lm);
        t[x].rm = max(t[rs(x)].rm, t[rs(x)].sum + t[x].val + t[ls(x)].rm);
        if (ls(x)) t[x].maxx = max(t[x].maxx, t[ls(x)].maxx);
        if (rs(x)) t[x].maxx = max(t[x].maxx, t[rs(x)].maxx);
    }
    inline void Reverse(int x) {
        if (!x) return;
        swap(ls(x), rs(x));
        swap(t[x].lm, t[x].rm);
        t[x].rev ^= 1;
    }
    inline void cover(int x, int val) {
        t[x].val = t[x].cov = val;
        t[x].tag = 1, t[x].sum = val * t[x].siz;
        t[x].lm = t[x].rm = max(0, t[x].sum);
        t[x].maxx = max(val, t[x].sum);
    }
    inline void push_down(int x) {
        if (!x) return;
        if (t[x].tag) {
            if (ls(x)) cover(ls(x), t[x].cov);
            if (rs(x)) cover(rs(x), t[x].cov);
            t[x].tag = 0, t[x].rev = 0;
        }
        if (t[x].rev) {
            if (ls(x)) Reverse(ls(x));
            if (rs(x)) Reverse(rs(x));
            t[x].rev ^= 1;
        }
    }
    void remove(int x) {
        if (!x) return;
        stk.push(x);
        if (ls(x)) remove(ls(x));
        if (rs(x)) remove(rs(x));
    }
    void split_size(int x, int siz, int &a, int &b) {
        if (!x || !siz) return a = 0, b = x, void();
        push_down(x);
        if (t[ls(x)].siz + 1 <= siz)
            a = x, split_size(rs(x), siz - (t[ls(x)].siz + 1), rs(x), b);
        else
            b = x, split_size(ls(x), siz, a, ls(x));
        push_up(x);
    }
    int merge(int x, int y) {
        push_down(x), push_down(y);
        if (!x || !y) return x | y;
        if (t[x].dat < t[y].dat) {
            rs(x) = merge(rs(x), y);
            return push_up(x), x;
        } else {
            ls(y) = merge(x, ls(y));
            return push_up(y), y;
        }
    }
}  // namespace FHQ_Treap
using namespace FHQ_Treap;
namespace Debug {
    inline void file() {
        freopen("fuck.in.txt", "r", stdin);
        freopen("aa.out", "w", stdout);
    }
    inline void dfs(int x) {
        if (ls(x)) dfs(ls(x));
        printf("%d ", t[x].val);
        if (rs(x)) dfs(rs(x));
    }
    inline void debug() {
        dfs(rt);
        puts("");
    }
#define _____ debug();
}  // namespace Debug
using namespace Debug;
char op[15];
signed main() {
    // file();
    srand(time(0));
    n = read(), m = read(), a = 0, b = 0, c = 0;
    for (ri i = 1; i <= n; i++) rt = merge(rt, New(read()));
    t[0].maxx = -INF;
    // cout << rt << endl;
    // _____
    for (ri i = 1; i <= m; i++) {
        scanf("%s", op + 1);
        if (op[1] == 'I') {
            int pos = read(), tot = read();
            split_size(rt, pos, a, b);
            for (ri i = 1; i <= tot; i++) a = merge(a, New(read()));
            rt = merge(a, b);
            // _____
        } else if (op[1] == 'D') {
            int pos = read(), tot = read();
            split_size(rt, pos - 1, a, b);
            split_size(b, tot, b, c);
            remove(b);
            merge(a, c);
            // _____
        } else if (op[1] == 'M' && op[3] == 'K') {
            int pos = read(), tot = read(), k = read();
            split_size(rt, pos - 1, a, b);
            split_size(b, tot, b, c);
            // change(b, k);
            cover(b, k);
            rt = merge(a, merge(b, c));
            // _____
        } else if (op[1] == 'R') {
            int pos = read(), tot = read();
            split_size(rt, pos - 1, a, b);
            split_size(b, tot, b, c);
            Reverse(b);
            rt = merge(a, merge(b, c));
            // _____
        } else if (op[1] == 'G') {
            int pos = read(), tot = read();
            split_size(rt, pos - 1, a, b);
            split_size(b, tot, b, c);
            // push_up(b);
            printf("%d\n", t[b].sum);
            // dfs(b);
            // puts("");
            rt = merge(a, merge(b, c));
            // _____
        } else {
            printf("%d\n", t[rt].maxx);
            // puts("");
            // printf("%d %d\n", t[rt].lm, t[rt].rm);
            // _____
        }
        // cout << m << endl << endl << endl;
    }
    return 0;
}
2021/8/15 22:26
加载中...