社区讨论
仅过HACK,0pts求调
P2572[SCOI2010] 序列操作参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mjf66z7b
- 此快照首次捕获于
- 2025/12/21 11:31 3 个月前
- 此快照最后确认于
- 2025/12/23 19:30 3 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define lson fa << 1, l, mid
#define rson fa << 1 | 1, mid + 1, r
int n, m;
const int N = 4e6 + 10;
struct node{
int sum, tag, rev, len;
int l, l0, r, r0, all, all0;
}tree[N * 4];
int a[N];
node operator +(node x, node y){
node fa;
fa.sum = x.sum + y.sum;
fa.len = x.len + y.len;
fa.l = x.l;
if (x.l == x.len) fa.l = x.l + y.l;
fa.r = y.r;
if (y.r == y.len) fa.r = y.r + x.r;
fa.l0 = x.l0;
if (x.l0 == x.len) fa.l0 = x.l0 + y.l0;
fa.r0 = y.r0;
if (y.r0 == y.len) fa.r0 = y.r0 + x.r0;
fa.all = max(max(x.all, y.all), x.r + y.l);
fa.all0 = max(max(x.all0, y.all0), x.r0 + y.l0);
return fa;
}
inline void push_up(int fa){
tree[fa] = tree[fa << 1] + tree[fa << 1 | 1];
}
inline void push_down(int fa, int l, int r){
if (tree[fa].tag){
tree[fa << 1].tag = tree[fa << 1 | 1].tag = tree[fa].tag;
tree[fa << 1].sum = tree[fa << 1].len * (tree[fa].tag - 1);
tree[fa << 1 | 1].sum = tree[fa << 1 | 1].len * (tree[fa].tag - 1);
if (tree[fa].tag == 2){
tree[fa << 1].l = tree[fa << 1].r = tree[fa << 1].all = tree[fa << 1].len;
tree[fa << 1].l0 = tree[fa << 1].r0 = tree[fa << 1].all0 = 0;
tree[fa << 1 | 1].l = tree[fa << 1 | 1].r = tree[fa << 1 | 1].all = tree[fa << 1 | 1].len;
tree[fa << 1 | 1].l0 = tree[fa << 1 | 1].r0 = tree[fa << 1 | 1].all0 = 0;
}
else{
tree[fa << 1].l = tree[fa << 1].r = tree[fa << 1].all = 0;
tree[fa << 1].l0 = tree[fa << 1].r0 = tree[fa << 1].all0 = tree[fa << 1].len;
tree[fa << 1 | 1].l = tree[fa << 1 | 1].r = tree[fa << 1 | 1].all = 0;
tree[fa << 1 | 1].l0 = tree[fa << 1 | 1].r0 = tree[fa << 1 | 1].all0 = tree[fa << 1 | 1].len;
}
tree[fa].tag = tree[fa << 1].rev = tree[fa << 1 | 1].rev = 0;
}
if (tree[fa].rev){
tree[fa << 1].rev ^= tree[fa].rev;
tree[fa << 1 | 1].rev ^= tree[fa].rev;
tree[fa << 1].sum = tree[fa << 1].len - tree[fa << 1].sum;
swap(tree[fa << 1].l, tree[fa << 1].l0);
swap(tree[fa << 1].r, tree[fa << 1].r0);
swap(tree[fa << 1].all, tree[fa << 1].all0);
tree[fa << 1 | 1].sum = tree[fa << 1 | 1].len - tree[fa << 1 | 1].sum;
swap(tree[fa << 1 | 1].l, tree[fa << 1 | 1].l0);
swap(tree[fa << 1 | 1].r, tree[fa << 1 | 1].r0);
swap(tree[fa << 1 | 1].all, tree[fa << 1 | 1].all0);
tree[fa].rev = 0;
}
}
inline void build(int fa, int l, int r){
if (l == r){
tree[fa].sum = a[l];
tree[fa].len = 1;
if (a[l] == 1) tree[fa].l = tree[fa].r = tree[fa].all = 1, tree[fa].l0 = tree[fa].r0 = tree[fa].all0 = 0;
else tree[fa].l0 = tree[fa].r0 = tree[fa].all0 = 1, tree[fa].l = tree[fa].r = tree[fa].all = 0;
return;
}
int mid = (l + r) >> 1;
build(lson);
build(rson);
push_up(fa);
}
inline void updata1(int fa, int l, int r, int ql, int qr, bool flag){
push_down(fa, l, r);
if (ql <= l && qr >= r){
tree[fa].tag = flag + 1;
tree[fa].rev = 0;
if (flag == 1){
tree[fa].sum = tree[fa].l = tree[fa].r = tree[fa].all = tree[fa].len;
tree[fa].l0 = tree[fa].r0 = tree[fa].all0 = 0;
}
else{
tree[fa].sum = tree[fa].l = tree[fa].r = tree[fa].all = 0;
tree[fa].l0 = tree[fa].r0 = tree[fa].all0 = tree[fa].len;
}
return;
}
int mid = (l + r) >> 1;
if (ql <= mid) updata1(lson, ql, qr, flag);
if (qr > mid) updata1(rson, ql, qr, flag);
push_up(fa);
}
inline void updata2(int fa, int l, int r, int ql, int qr){
push_down(fa, l, r);
if (ql <= l && qr >= r){
tree[fa].rev ^= 1;
tree[fa].sum = tree[fa].len - tree[fa].sum;
swap(tree[fa].l, tree[fa].l0);
swap(tree[fa].r, tree[fa].r0);
swap(tree[fa].all, tree[fa].all0);
return;
}
int mid = (l + r) >> 1;
if (ql <= mid) updata2(lson, ql, qr);
if (qr > mid) updata2(rson, ql, qr);
push_up(fa);
}
inline node query(int fa, int l, int r, int ql, int qr){
push_down(fa, l, r);
if (ql <= l && qr >= r){
return tree[fa];
}
int mid = (l + r) >> 1;
node ans = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
if (ql <= mid && qr > mid) return query(lson, ql, qr) + query(rson, ql, qr);
if (ql <= mid) return query(lson, ql, qr);
if (qr > mid) return query(rson, ql, qr);
}
signed main(){
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> a[i];
build(1, 1, n);
while (m--){
int opt, l, r;
cin >> opt >> l >> r;
l += 1;
r += 1;
if (l > r) swap(l, r);
if (opt == 0 || opt == 1){
updata1(1, 1, n, l, r, opt);
}
if (opt == 2){
updata2(1, 1, n, l, r);
}
if (opt == 3 || opt == 4){
node ans = query(1, 1, n, l, r);
if (opt == 3) cout << ans.sum <<"\n";
if (opt == 4) cout << ans.all << "\n";
}
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...