比赛 |
2025暑期集训第2场 |
评测结果 |
AAAAAAAAAA |
题目名称 |
序列操作 |
最终得分 |
100 |
用户昵称 |
左清源 |
运行时间 |
1.375 s |
代码语言 |
C++ |
内存使用 |
11.22 MiB |
提交时间 |
2025-06-29 14:14:25 |
显示代码纯文本
#include <iostream>
#include <cstdio>
using namespace std;
const int N=1e5+10;
int a[N],n,m;
struct sgt{
int sum[N<<2],len[N<<2];
int dmax1[N<<2],lmax1[N<<2],rmax1[N<<2];
int dmax0[N<<2],lmax0[N<<2],rmax0[N<<2];
int tag1[N<<2],tag2[N<<2];
int asum,amax,almax,armax,alen;
#define ls (p<<1)
#define rs (p<<1|1)
void reset(){asum=amax=almax=armax=alen=0;}
void updata(int p){
if(!asum){
asum=sum[p],amax=dmax1[p],almax=lmax1[p],armax=rmax1[p],alen=len[p];
}else{
amax=max(max(amax,dmax1[p]),armax+lmax1[p]);
almax=(asum==alen)?(alen+lmax1[p]):almax;
armax=(sum[p]==len[p])?(len[p]+armax):rmax1[p];
asum+=sum[p],alen+=len[p];
}
}
void build(int p,int l,int r){
len[p]=r-l+1;tag2[p]=-1;
if(l==r){
if(a[l])sum[p]=dmax1[p]=lmax1[p]=rmax1[p]=1;
else dmax0[p]=lmax0[p]=rmax0[p]=1;return;
}
int mid=(l+r)>>1;
build(ls,l,mid),build(rs,mid+1,r);
push_up(p);return;
}
void push_up(int p){
sum[p]=sum[ls]+sum[rs];
dmax1[p]=max(max(dmax1[ls],dmax1[rs]),rmax1[ls]+lmax1[rs]);
lmax1[p]=(sum[ls]==len[ls])?(len[ls]+lmax1[rs]):(lmax1[ls]);
rmax1[p]=(sum[rs]==len[rs])?(len[rs]+rmax1[ls]):(rmax1[rs]);
dmax0[p]=max(max(dmax0[ls],dmax0[rs]),rmax0[ls]+lmax0[rs]);
lmax0[p]=(sum[ls])?(lmax0[ls]):(len[ls]+lmax0[rs]);
rmax0[p]=(sum[rs])?(rmax0[rs]):(len[rs]+rmax0[ls]);
return;
}
void make_tag2(int p,int v){
tag1[p]=0;tag2[p]=v;
if(v){
sum[p]=len[p];
dmax1[p]=lmax1[p]=rmax1[p]=len[p];
dmax0[p]=lmax0[p]=rmax0[p]=0;
}else{
sum[p]=0;
dmax0[p]=lmax0[p]=rmax0[p]=len[p];
dmax1[p]=lmax1[p]=rmax1[p]=0;
}
return;
}
void make_tag1(int p){
if(tag2[p]!=-1){
make_tag2(p,!tag2[p]);
}else{
tag1[p]^=1;
sum[p]=len[p]-sum[p];
swap(dmax0[p],dmax1[p]);
swap(lmax0[p],lmax1[p]);
swap(rmax0[p],rmax1[p]);
}
return;
}
void push_down(int p){
if(tag2[p]!=-1)make_tag2(ls,tag2[p]),make_tag2(rs,tag2[p]),tag2[p]=-1;
if(tag1[p])make_tag1(ls),make_tag1(rs),tag1[p]=0;
return;
}
void assign(int p,int l,int r,int L,int R,int v){
if(L<=l&&r<=R){
make_tag2(p,v);
return;
}else{
int mid=(l+r)>>1;push_down(p);
if(L<=mid)assign(ls,l,mid,L,R,v);
if(R>mid)assign(rs,mid+1,r,L,R,v);
push_up(p);return;
}
}
void reverse(int p,int l,int r,int L,int R){
if(L<=l&&r<=R){
make_tag1(p);
return;
}else{
int mid=(l+r)>>1;push_down(p);
if(L<=mid)reverse(ls,l,mid,L,R);
if(R>mid)reverse(rs,mid+1,r,L,R);
push_up(p);return;
}
}
int ask(int p,int l,int r,int L,int R){
if(L<=l&&r<=R)return sum[p];
int mid=(l+r)>>1,cnt=0;push_down(p);
if(L<=mid)cnt+=ask(ls,l,mid,L,R);
if(R>mid)cnt+=ask(rs,mid+1,r,L,R);
return cnt;
}
void query(int p,int l,int r,int L,int R){
if(L<=l&&r<=R){updata(p);return;}
int mid=(l+r)>>1;push_down(p);
if(L<=mid)query(ls,l,mid,L,R);
if(R>mid)query(rs,mid+1,r,L,R);
return;
}
}tr;
int main(){
freopen("sequence.in","r",stdin);
freopen("sequence.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",a+i);
tr.build(1,1,n);
while(m--){
int o,x,y;
scanf("%d %d %d",&o,&x,&y);
x++,y++;
if(o==0)tr.assign(1,1,n,x,y,0);
if(o==1)tr.assign(1,1,n,x,y,1);
if(o==2)tr.reverse(1,1,n,x,y);
if(o==3)printf("%d\n",tr.ask(1,1,n,x,y));
if(o==4){
tr.reset();
tr.query(1,1,n,x,y);
printf("%d\n",tr.amax);
}
}
return 0;
}