比赛 |
2025暑期集训第2场 |
评测结果 |
AAAAAAAAAA |
题目名称 |
序列操作 |
最终得分 |
100 |
用户昵称 |
淮淮清子 |
运行时间 |
1.172 s |
代码语言 |
C++ |
内存使用 |
11.69 MiB |
提交时间 |
2025-06-29 17:28:58 |
显示代码纯文本
#include <iostream>
#include <algorithm>
using namespace std;
#define lc p << 1
#define rc p << 1 | 1
const int MAXN = 1e5 + 5;
struct Node{
int l, r;
int sum;
int la0, ra0, ans0;
int la1, ra1, ans1;
int cov;
int rev;
}t[MAXN * 4];
int a[MAXN];
int n, m;
void setc(int p, int c){
int len = t[p].r - t[p].l + 1;
t[p].cov = c;
t[p].rev = 0;
if(c == 1){
t[p].sum = len;
t[p].la1 = len; t[p].ra1 = len; t[p].ans1 = len;
t[p].la0 = 0; t[p].ra0 = 0; t[p].ans0 = 0;
}
else{
t[p].sum = 0;
t[p].la1 = 0; t[p].ra1 = 0; t[p].ans1 = 0;
t[p].la0 = len; t[p].ra0 = len; t[p].ans0 = len;
}
}
void neg(int p) {
t[p].sum = (t[p].r - t[p].l + 1) - t[p].sum;
swap(t[p].la0, t[p].la1);
swap(t[p].ra0, t[p].ra1);
swap(t[p].ans0, t[p].ans1);
}
void pushup(int p) {
Node &L = t[lc];
Node &R = t[rc];
int lenL = L.r - L.l + 1;
int lenR = R.r - R.l + 1;
t[p].sum = L.sum + R.sum;
t[p].la1 = L.la1;
if (L.la1 == lenL) t[p].la1 = lenL + R.la1;
t[p].ra1 = R.ra1;
if (R.ra1 == lenR) t[p].ra1 = lenR + L.ra1;
t[p].ans1 = max(max(L.ans1, R.ans1), L.ra1 + R.la1);
t[p].la0 = L.la0;
if (L.la0 == lenL) t[p].la0 = lenL + R.la0;
t[p].ra0 = R.ra0;
if (R.ra0 == lenR) t[p].ra0 = lenR + L.ra0;
t[p].ans0 = max(max(L.ans0, R.ans0), L.ra0 + R.la0);
}
void pushdown(int p){
if(t[p].cov != -1){
setc(lc, t[p].cov);
setc(rc, t[p].cov);
t[p].cov = -1;
}
if(t[p].rev) {
if(t[lc].cov != -1){
t[lc].cov ^= 1;
setc(lc, t[lc].cov);
}
else {
t[lc].rev ^= 1;
neg(lc);
}
if(t[rc].cov != -1){
t[rc].cov ^= 1;
setc(rc, t[rc].cov);
}
else {
t[rc].rev ^= 1;
neg(rc);
}
t[p].rev = 0;
}
}
void build(int p, int l, int r){
t[p].l = l; t[p].r = r;
t[p].cov = -1; t[p].rev = 0;
if(l == r){
t[p].sum = a[l];
if(a[l] == 1) {
t[p].la1 = 1; t[p].ra1 = 1; t[p].ans1 = 1;
t[p].la0 = 0; t[p].ra0 = 0; t[p].ans0 = 0;
}
else {
t[p].la1 = 0; t[p].ra1 = 0; t[p].ans1 = 0;
t[p].la0 = 1; t[p].ra0 = 1; t[p].ans0 = 1;
}
return;
}
int mid = (l + r) >> 1;
build(lc, l, mid);
build(rc, mid + 1, r);
pushup(p);
}
void apply_set(int p, int l, int r, int c){
if(l <= t[p].l && t[p].r <= r){
setc(p, c);
return;
}
pushdown(p);
int mid = (t[p].l + t[p].r) >> 1;
if (l <= mid) apply_set(lc, l, r, c);
if (r > mid) apply_set(rc, l, r, c);
pushup(p);
}
void apply_neg(int p, int l, int r){
if(l <= t[p].l && t[p].r <= r){
if(t[p].cov != -1){
t[p].cov ^= 1;
setc(p, t[p].cov);
}
else{
t[p].rev ^= 1;
neg(p);
}
return;
}
pushdown(p);
int mid = (t[p].l + t[p].r) >> 1;
if (l <= mid) apply_neg(lc, l, r);
if (r > mid) apply_neg(rc, l, r);
pushup(p);
}
int query_sum(int p, int l, int r){
if(l <= t[p].l && t[p].r <= r) return t[p].sum;
pushdown(p);
int mid = (t[p].l + t[p].r) >> 1;
int res = 0;
if(l <= mid) res += query_sum(lc, l, r);
if(r > mid) res += query_sum(rc, l, r);
return res;
}
struct Res{
int la1, ra1, ans1, len;
};
Res merge_res(Res L, Res R){
Res res;
res.len = L.len + R.len;
res.la1 = L.la1;
if(L.la1 == L.len) res.la1 = L.len + R.la1;
res.ra1 = R.ra1;
if(R.ra1 == R.len) res.ra1 = R.len + L.ra1;
res.ans1 = max(max(L.ans1, R.ans1), L.ra1 + R.la1);
return res;
}
Res query_res(int p, int l, int r){
if(l <= t[p].l && t[p].r <= r) return { t[p].la1, t[p].ra1, t[p].ans1, t[p].r - t[p].l + 1 };
pushdown(p);
int mid = (t[p].l + t[p].r) >> 1;
if(r <= mid) return query_res(lc, l, r);
else if (l > mid) return query_res(rc, l, r);
else{
Res L = query_res(lc, l, r);
Res R = query_res(rc, l, r);
return merge_res(L, R);
}
}
int main(){
freopen("sequence.in","r",stdin);
freopen("sequence.out","w",stdout);
cin.tie(0) -> sync_with_stdio(0);
cin >> n >> m;
for(int i = 1;i <= n;i ++) cin >> a[i];
build(1, 1, n);
while(m --){
int op, l, r;
cin >> op >> l >> r;
l ++;r ++;
if(op == 0) apply_set(1, l, r, 0);
else if(op == 1) apply_set(1, l, r, 1);
else if(op == 2) apply_neg(1, l, r);
else if(op == 3) cout << query_sum(1, l, r) << '\n';
else if(op == 4){
Res res = query_res(1, l, r);
cout << res.ans1 << '\n';
}
}
return 0;
}