社区讨论
诗山代码求条,WA on all the test,玄关
P2572[SCOI2010] 序列操作参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mkgv5btp
- 此快照首次捕获于
- 2026/01/16 20:37 上个月
- 此快照最后确认于
- 2026/01/18 23:55 上个月
CPP
#include<bits/stdc++.h>
#define lc p<<1
#define rc p<<1|1
#define endl putchar('\n')
#define psp putchar(' ')
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int N=1e5+5;
int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();
return x*f;
}
void print(int x){
if(x<0)putchar('-'),x=-x;
if(x<10){putchar(x+'0');return;}
print(x/10);
putchar(x%10+'0');
}
void putstr(string s){
for(int i=0;i<s.size();i++)putchar(s[i]);
}
int lowbit(int x){
return x&-x;
}
int n,m,k;
int T;
int a[N];
struct node{
int l,r,num0,num1;
int ans0,ans1;
int lans0,rans0;
int lans1,rans1;
int tag,cnt;
int L,R;
int len;
}f[4*N];
void pushup(int p){
f[p].num0=f[lc].num0+f[rc].num0;
f[p].num1=f[lc].num1+f[rc].num1;
f[p].ans0=max(f[lc].ans0,f[rc].ans0);
f[p].ans1=max(f[lc].ans1,f[rc].ans1);
if(f[lc].R==f[rc].L&&f[lc].R==0)f[p].ans0=max(f[p].ans0,f[lc].rans0+f[rc].lans0);
if(f[lc].R==f[rc].L&&f[lc].R==1)f[p].ans1=max(f[p].ans1,f[lc].rans1+f[rc].lans1);
f[p].lans0=f[lc].lans0==f[lc].len?f[lc].lans0+f[rc].lans0:f[lc].lans0;
f[p].lans1=f[lc].lans1==f[lc].len?f[lc].lans1+f[rc].lans1:f[lc].lans1;
f[p].rans0=f[rc].rans0==f[rc].len?f[rc].rans0+f[lc].rans0:f[rc].rans0;
f[p].rans1=f[rc].rans1==f[rc].len?f[rc].rans1+f[lc].rans1:f[rc].rans1;
f[p].L=f[lc].L;
f[p].R=f[rc].R;
}
void build(int p,int l,int r){
f[p]=node{l,r,a[l]==0,a[l]==1,a[l]==0,a[l]==1,a[l]==0,a[l]==0,a[l]==1,a[l]==1,-1,0,a[l],a[l],r-l+1};
if(l==r)return;
int mid=l+r>>1;
build(lc,l,mid);
build(rc,mid+1,r);
pushup(p);
}
void down(int p){
if(f[p].tag){
f[lc].tag=f[rc].tag=f[p].tag;
if(f[p].tag==0){
f[lc].lans1=f[lc].rans1=f[lc].ans1=f[lc].num1=0;
f[rc].lans1=f[rc].rans1=f[rc].ans1=f[rc].num1=0;
f[lc].lans0=f[lc].rans0=f[lc].ans0=f[lc].num0=f[lc].len;
f[rc].lans0=f[rc].rans0=f[rc].ans0=f[rc].num0=f[rc].len;
}
else{
f[lc].lans1=f[lc].rans1=f[lc].ans1=f[lc].num1=f[lc].len;
f[rc].lans1=f[rc].rans1=f[rc].ans1=f[rc].num1=f[rc].len;
f[lc].lans0=f[lc].rans0=f[lc].ans0=f[lc].num0=0;
f[rc].lans0=f[rc].rans0=f[rc].ans0=f[rc].num0=0;
}
f[lc].L=f[lc].R=f[rc].L=f[rc].R=f[p].tag;
f[p].cnt=0;
f[p].tag=-1;
}
if(f[p].cnt%2){
f[lc].cnt++,f[rc].cnt++;
swap(f[lc].lans0,f[lc].lans1);
swap(f[lc].rans0,f[lc].rans1);
swap(f[rc].lans0,f[rc].lans1);
swap(f[rc].rans0,f[rc].rans1);
swap(f[lc].ans0,f[lc].ans1);
swap(f[rc].ans0,f[rc].ans1);
swap(f[lc].num0,f[lc].num1);
swap(f[rc].num0,f[rc].num1);
f[lc].L=1-f[lc].L;
f[lc].R=1-f[lc].R;
f[rc].L=1-f[rc].L;
f[rc].R=1-f[rc].R;
if(f[lc].tag!=-1)f[lc].tag=1-f[lc].tag;
if(f[rc].tag!=-1)f[rc].tag=1-f[rc].tag;
f[p].cnt=0;
}
}
void update(int p,int l,int r,int k){
if(l<=f[p].l&&f[p].r<=r){
if(k==0){
f[p].lans1=f[p].rans1=f[p].ans1=f[p].num1=0;
f[p].lans0=f[p].rans0=f[p].ans0=f[p].num0=f[p].len;
}
else{
f[p].lans1=f[p].rans1=f[p].ans1=f[p].num1=f[p].len;
f[p].lans0=f[p].rans0=f[p].ans0=f[p].num0=0;
}
f[p].L=f[p].R=k;
f[p].tag=k;
return;
}
down(p);
int mid=f[p].l+f[p].r>>1;
if(l<=mid)update(lc,l,r,k);
if(r>mid)update(rc,l,r,k);
pushup(p);
}
void flip(int p,int l,int r){
if(l<=f[p].l&&f[p].r<=r){
swap(f[p].lans0,f[p].lans1);
swap(f[p].rans0,f[p].rans1);
swap(f[p].ans0,f[p].ans1);
swap(f[p].num0,f[p].num1);
if(f[p].tag!=-1)f[p].tag=1-f[p].tag;
f[p].cnt++;
f[p].L=1-f[p].L;
f[p].R=1-f[p].R;
return;
}
down(p);
int mid=f[p].l+f[p].r>>1;
if(l<=mid)flip(lc,l,r);
if(r>mid)flip(rc,l,r);
pushup(p);
}
int query_num(int p,int l,int r){
if(l<=f[p].l&&f[p].r<=r){
return f[p].num1;
}
down(p);
int mid=f[p].l+f[p].r>>1;
int res=0;
if(l<=mid)res+=query_num(lc,l,r);
if(r>mid)res+=query_num(rc,l,r);
return res;
}
node query(int p,int l,int r){
if(l<=f[p].l&&f[p].r<=r){
return f[p];
}
down(p);
int mid=f[p].l+f[p].r>>1;
node res={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
if(r<=mid){
return query(lc,l,r);
}
else if(l>mid){
return query(rc,l,r);
}
else{
node ls=query(lc,l,r);
node rs=query(rc,l,r);
res.ans1=max(ls.ans1,rs.ans1);
if(ls.R==rs.L&&ls.R==1)res.ans1=max(res.ans1,ls.rans1+rs.lans1);
res.L=ls.L;
res.R=rs.R;
res.len=ls.len+rs.len;
res.lans1=ls.lans1==ls.len?ls.lans1+ls.lans1:ls.lans1;
res.rans1=rs.rans1==rs.len?rs.rans1+rs.rans1:rs.rans1;
return res;
}
}
signed main(){
//ios::sync_with_stdio(0);
n=read(),m=read();
for(int i=1;i<=n;i++)a[i]=read();
build(1,1,n);
while(m--){
int op=read(),l=read(),r=read();
if(op==0){
update(1,l,r,0);
}
else if(op==1){
update(1,l,r,1);
}
else if(op==2){
flip(1,l,r);
}
else if(op==3){
print(query_num(1,l,r)),endl;
}
else{
print(query(1,l,r).ans1),endl;
}
}
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...