社区讨论
样例未过求条
P2572[SCOI2010] 序列操作参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mhjadpt9
- 此快照首次捕获于
- 2025/11/03 23:20 4 个月前
- 此快照最后确认于
- 2025/11/03 23:20 4 个月前
rt,样例最后一个点少一
CPP#include<bits/stdc++.h>
#define lp p<<1
#define rp p<<1|1
#define int long long
using namespace std;
const int N = 1e5 + 10, MOD = 1e9 + 7, inf = 1e9;
struct node{
int len, s0, s1, lm0, rm0, m0, lm1, rm1, m1;
}tr[N * 4], e;
int n, m, a[N], tag[N * 4], tag2[N * 4];
node comb(node a, node b){
node c = a;
c.len += b.len, c.s0 += b.s0, c.s1 += b.s1;
c.m0 = max({b.m0, a.m0, a.rm0 + b.lm0});
c.rm0 = b.rm0;
if(a.s1 == 0){
c.lm0 = max(c.lm0, a.s0 + b.lm0);
}
if(b.s1 == 0){
c.rm0 = max(c.rm0, b.s0 + a.rm0);
}
c.m1 = max({b.m1, a.m1, a.rm1 + b.lm1});
c.rm1 = b.rm1;
if(a.s0 == 0){
c.lm1 = max(c.lm1, a.s1 + b.lm1);
}
if(b.s0 == 0){
c.rm1 = max(c.rm1, b.s1 + a.rm1);
}
return c;
}
void change(int p, int x){
if(x == 0){
tr[p].s0 = tr[p].m0 = tr[p].lm0 = tr[p].rm0 = tr[p].len;
tr[p].s1 = tr[p].m1 = tr[p].lm1 = tr[p].rm1 = 0;
}else{
tr[p].s0 = tr[p].m0 = tr[p].lm0 = tr[p].rm0 = 0;
tr[p].s1 = tr[p].m1 = tr[p].lm1 = tr[p].rm1 = tr[p].len;
}
}
void build(int l, int r, int p){
tag[p] = -1;
if(l == r){
tr[p].len = 1;
change(p, a[l]);
return ;
}
int mid = (l + r) >> 1;
build(l, mid, lp), build(mid + 1, r, rp);
tr[p] = comb(tr[lp], tr[rp]);
}
void pushdown(int p){
if(tag[p] != -1){
tag2[p] = tag2[lp] = tag2[rp] = 0;
change(lp, tag[p]), change(rp, tag[p]);
tag[lp] = tag[rp] = tag[p], tag[p] = -1;
}
if(tag2[p]){
(tag[lp] != -1 ? tag[lp] ^= 1 : tag2[lp] ^= 1);
(tag[rp] != -1 ? tag[rp] ^= 1 : tag2[rp] ^= 1);
swap(tr[lp].s0, tr[lp].s1), swap(tr[lp].m0, tr[lp].m1);
swap(tr[rp].s0, tr[rp].s1), swap(tr[rp].m0, tr[rp].m1);
swap(tr[lp].lm0, tr[lp].lm1), swap(tr[lp].rm0, tr[lp].rm1);
swap(tr[rp].lm0, tr[rp].lm1), swap(tr[rp].rm0, tr[rp].rm1);
tag[p] = 0;
}
}
void update1(int l, int r, int p, int s, int t, int x){
pushdown(p);
if(s <= l && r <= t){
change(p, x);
tag[p] = x;
return ;
}
int mid = (l + r) >> 1;
if(s <= mid){
update1(l, mid, lp, s, t, x);
}
if(t > mid){
update1(mid + 1, r, rp, s, t, x);
}
tr[p] = comb(tr[lp], tr[rp]);
}
void update2(int l, int r, int p, int s, int t){
pushdown(p);
if(s <= l && r <= t){
swap(tr[p].s0, tr[p].s1), swap(tr[p].m0, tr[p].m1);
swap(tr[p].lm0, tr[p].lm1), swap(tr[p].rm0, tr[p].rm1);
tag2[p] ^= 1;
return ;
}
int mid = (l + r) >> 1;
if(s <= mid){
update2(l, mid, lp, s, t);
}
if(t > mid){
update2(mid + 1, r, rp, s, t);
}
tr[p] = comb(tr[lp], tr[rp]);
}
node query(int l, int r, int p, int s, int t){
pushdown(p);
if(s <= l && r <= t){
return tr[p];
}
if(l > t || r < s){
return e;
}
int mid = (l + r) >> 1;
return comb(query(l, mid, lp, s, t), query(mid + 1, r, rp, s, t));
}
signed main(){
//ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n >> m;
for(int i = 1; i <= n; i++){
cin >> a[i];
}
build(1, n, 1);
for(int op, l, r; m--; ){
cin >> op >> l >> r;
l++, r++;
if(op <= 1){
update1(1, n, 1, l, r, op);
}else if(op == 2){
update2(1, n, 1, l, r);
}else{
node t = query(1, n, 1, l, r);
if(op == 3){
cout << t.s1 << '\n';
}else{
cout << t.m1 << '\n';
}
}
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...