社区讨论
娇小可爱 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 条回复,欢迎继续交流。
正在加载回复...