社区讨论

娇小可爱 FHQ 在线求调。调教赏关

P5586[P5350] 序列 (加强版)参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mdcm0i5m
此快照首次捕获于
2025/07/21 12:32
7 个月前
此快照最后确认于
2025/07/21 16:44
7 个月前
查看原帖
写的定期重构,自认为马蜂良好。
目前样例能过,交上去 RE / MLE,把数据下载下来,发现输出了一堆 0
CPP
#include <bits/stdc++.h> 
using namespace std;
typedef long long ll;
const int N=3e5+6, mod=1e9+7, M=1e7;
inline ll rd() {
    ll x(0); bool f(0); char ch = getchar();
    while(!isdigit(ch)) f = ch == '-', ch = getchar();
    while(isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
    return f ? -x : x;
}
inline void wt(ll x, bool md = 1) {
    if(x < 0) putchar('-'), x = -x;
    static int sk[64], tp(0);
    do sk[++ tp] = x % 10, x /= 10; while(x); // do first
    while(tp) putchar(sk[tp --] | 48);
    md ? putchar('\n') : putchar(' ');
}
#define For(i, s, e) for(int i = s; i <= e; ++i)
// #define int long long
mt19937 rnd(time(0));
bool rand01(ll x, ll y) {return y * rnd() < x * RAND_MAX;}
int tot, rt, a[N], tp;
struct FHQ{ // 顺序是 sign add reverse
    struct node{
        int l, r, x, siz; // dont forget to modify x, this is different from sgt
        ll sum;
        int ts; ll ta; bool tr;// ts = -1 means no need for change
        inline void upd(int s, ll a, bool rev) {
            if(s >= 0) sum = 1ll * s * siz % mod, ts = s, ta = 0, tr = 0, x = 0; // wa *2
            sum = (sum + 1ll * a * siz) % mod, x = (x + a) % mod; // wa *1
            if(rev) swap(l, r);
            tr ^= rev, ta = (ta + a) % mod;
        }
    }t[M];
    inline int nd(int x) {
        t[++ tot] = {0, 0, x, 1, x, -1, 0, 0};
        return tot;
    }
    inline int cpnd(int x) {
        t[++ tot] = t[x];
        return tot;
    }
    #define lsz t[t[p].l].siz
    #define ls t[p].l
    #define rs t[p].r
    inline void up(int p) {
        if(!p) return ;
        t[p].siz = t[ls].siz + t[rs].siz + 1;
        t[p].sum = (t[ls].sum + t[rs].sum + t[p].x) % mod;
    }
    inline void dn(int p) {
        if(ls) ls = cpnd(ls), t[ls].upd(t[p].ts, t[p].ta, t[p].tr);
        if(rs) rs = cpnd(rs), t[rs].upd(t[p].ts, t[p].ta, t[p].tr);
        t[p].ts = -1, t[p].ta = 0, t[p].tr = 0; // clear
    }
    void split(int p, int k, int &x, int &y) {
        if(!p) {x = y = 0; return ;}
        dn(p = cpnd(p));
        if(k <= lsz) {y = p, split(ls, k, x, ls), up(y);}
        else {x = p, split(rs, k - lsz - 1, rs, y), up(x);}
    }
    int merge(int x, int y) {
        if(!x || !y) return x | y;
        if(rand01(t[x].siz, t[y].siz + t[x].siz)) {dn(y = cpnd(y)), t[y].l = merge(x, t[y].l), up(y); return y;}
        else {dn(x = cpnd(x)), t[x].r = merge(t[x].r, y), up(x); return x;}
    }//
    ll sum(int l, int r) {
        int x, y, z;
        split(rt, r, x, z);
        split(x, l - 1, x, y);
        ll res = t[y].sum;
        rt = merge(x, merge(y, z));
        return res;
    }
    void mdf(int l, int r, int s, int a, bool rev) { // s = -1!
        int x, y, z;
        split(rt, r, x, z);
        split(x, l - 1, x, y);
        t[y].upd(s, a, rev);
        rt = merge(x, merge(y, z));
    } 
    void chg(int l1, int r1, int l2, int r2, bool op) {
        int v, w, x, y, z;
        if(r2 > r1) {
            split(rt, r2, v, z);
            split(v, l2 - 1, v, y);
            split(v, r1, v, x);
            split(v, l1 - 1, v, w);
        } else {
            split(rt, r1, x, v);
            split(x, l1 - 1, x, w);
            split(x, r2, x, z);
            split(x, l2 - 1, x, y);
        }
        if(!op) {
            y = cpnd(w);
        }
        else {
            swap(y, w);
        }
        if(r2 > r1) {
            rt = merge(merge(merge(merge(v, w), x), y), z);
        }else {
            rt = merge(merge(merge(merge(x, y), z), w), v);
        } // dont forget to merge
    }
    void out(int p = rt) {
        if(!p) return ;
        dn(p);
        if(ls) out(ls);
        wt(t[p].x, 0);
        if(rs) out(rs);
        up(p);
    }
    void rec(int p = rt) {
        dn(p);
        if(ls) rec(ls);
        a[++ tp] = t[p].x;
        if(rs) rec(rs);
        up(p);
    }
    void bt(int n) {
        if(!n) rec();
        else for(int i = 1; i <= n; ++i) a[++ tp] = rd();
        For(i, 1, tot) t[i] = t[0];
        rt = tot = 0;
        For(i, 1, tp) rt = merge(rt, nd(a[i]));
        tp = 0;
    }
}T;
ll lstans;
signed main() {
    // freopen("P5586_1.in","r",stdin);
    // freopen("data.txt","r",stdin);
    // freopen("my.txt","w",stdout);
    int n = rd(), m = rd();
    T.bt(n);
    For(i, 1, m) {
        int op = rd(), l = rd() ^ lstans, r = rd() ^ lstans;
        if(op == 1) {
            wt(lstans = T.sum(l, r));
        } else if(op == 2) {
            int x = rd() ^ lstans;
            T.mdf(l, r, x, 0, 0);
        } else if(op == 3) {
            int x = rd() ^ lstans;
            T.mdf(l, r, -1, x, 0);
        } else if(op == 6) {
            T.mdf(l, r, -1, 0, 1);
        } 
        else {
            int l2 = rd() ^ lstans, r2 = rd() ^ lstans;
            T.chg(l, r, l2, r2, op - 4);
        }
        if(tot + N > M) T.bt(0);
    }
    T.out(); puts("");
    return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...