温馨提示:本人蒟蒻
同学给我推荐的题,写完之后116行满江红
本人代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,m,a[100005],tree[3][500005],add[500005];
void pushup(int rt)
{
tree[0][rt]=tree[0][rt<<1]+tree[0][rt<<1|1];
tree[1][rt]=max(tree[1][rt<<1],tree[1][rt<<1|1]);
tree[2][rt]=max(tree[2][rt<<1],tree[2][rt<<1|1]);
}
void pushdown(int rt,int len)
{
if(add[rt]==0)
{
tree[0][rt<<1]=tree[0][rt<<1|1]=
tree[1][rt<<1]=tree[1][rt<<1|1]=0,
tree[2][rt<<1]=tree[2][rt<<1|1]=len,
add[rt]=-1,add[rt<<1]=add[rt<<1|1]=0;
}
if(add[rt]==1)
{
tree[0][rt<<1]=tree[1][rt<<1]=
tree[0][rt<<1|1]=tree[1][rt<<1|1]=len,
tree[2][rt<<1]=tree[2][rt<<1|1]=0,
add[rt]=-1,add[rt<<1]=add[rt<<1|1]=1;
}
if(add[rt]==2)
{
tree[0][rt<<1]=(len+1>>1)-tree[0][rt<<1],
tree[0][rt<<1|1]=(len>>1)-tree[0][rt<<1|1],
add[rt<<1]=add[rt<<1|1]=2,add[rt]=-1;
swap(tree[1][rt<<1],tree[2][rt<<1]);
swap(tree[1][rt<<1|1],tree[2][rt<<1|1]);
}
}
void build(int l,int r,int rt)
{
if(l==r)
{
tree[0][rt]=tree[1][rt]=a[l],tree[2][rt]=!a[l];
return ;
}
int mid=l+r>>1;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
pushup(rt);
}
void update(int ul,int ur,int k,int l,int r,int rt)
{
if(ul<=l&&ur>=r)
{
if(k==0||k==1)
tree[0][rt]=tree[1][rt]=k*(r-l+1),
tree[2][rt]=!k*(r-l+1),add[rt]=k;
else if(k==2)
{
tree[0][rt]=r-l+1-tree[0][rt],add[rt]=k;
swap(tree[1][rt],tree[2][rt]);
}
return ;
}
int mid=l+r>>1;
pushdown(rt,r-l+1);
if(ul<=mid)
update(ul,ur,k,l,mid,rt<<1);
if(ur>mid)
update(ul,ur,k,mid+1,r,rt<<1|1);
pushup(rt);
}
int query3(int ql,int qr,int l,int r,int rt)
{
if(ql<=l&&qr>=r)
return tree[0][rt];
int mid=l+r>>1,cnt=0;
pushdown(rt,r-l+1);
if(ql<=mid)
cnt+=query3(ql,qr,l,mid,rt<<1);
if(qr>mid)
cnt+=query3(ql,qr,mid+1,r,rt<<1|1);
return cnt;
}
int query4(int ql,int qr,int l,int r,int rt)
{
if(ql<=l&&qr>=r)
return tree[1][rt];
int mid=l+r>>1,cnt=INT_MIN;
pushdown(rt,r-l+1);
if(ql<=mid)
cnt=max(cnt,query4(ql,qr,l,mid,rt<<1));
if(qr>mid)
cnt=max(cnt,query4(ql,qr,mid+1,r,rt<<1|1));
return cnt;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
memset(add,-1,sizeof(add));
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,n,1);
for(int i=1;i<=m;i++)
{
int op,x,y;
cin>>op>>x>>y;
switch(op)
{
case 0:update(x,y,0,1,n,1);break;
case 1:update(x,y,1,1,n,1);break;
case 2:update(x,y,2,1,n,1);break;
case 3:cout<<query3(x,y,1,n,1)<<'\n';break;
case 4:cout<<query4(x,y,1,n,1)<<'\n';break;
default :break;
}
}
return 0;
}
望相助!