我能自己爬了 @ 2022-02-09 22:51:40
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll rd(){
ll w=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9')f=(ch=='-')?-1:1,ch=getchar();
while(ch>='0'&&ch<='9')w=(w<<1)+(w<<3)+(ch^48),ch=getchar();
return w*f;
}
const int lm=100001;
ll n,m,a[lm],b[lm];
struct node{
ll id,r;
}wyz[lm<<2];
ll ls(ll p){
return p<<1;
}
ll rs(ll p){
return p<<1|1;
}
ll ans[lm<<2],tag[lm<<2],tag3[lm<<2],tag2[lm<<2],ans3[lm<<2],ans4[lm<<2],ans2[lm<<2],ans5[lm<<2],ans6[lm<<2],ans7[lm<<2];
//ans--总共有多少1 1--全0 2--全1 3--取反 ans3---左边最长 ans4---右边最长 ans2---最多连续的1 ans5--左边 ans6---右边 ans7--最多连续
void push_up(ll p,ll l,ll r){
ll mid=(l+r)>>1;
ans[p]=ans[ls(p)]+ans[rs(p)];
ans2[p]=max(ans2[rs(p)],max(ans2[ls(p)],ans3[rs(p)]+ans4[ls(p)]));
ans3[p]=ans3[ls(p)]+(ans3[rs(p)]*(ans7[ls(p)]==0));
ans4[p]=ans4[rs(p)]+(ans4[ls(p)]*(0==ans7[rs(p)]));
ans2[p]=max(ans2[p],max(ans3[p],ans4[p]));
ans5[p]=ans5[ls(p)]+(ans5[rs(p)]*(0==ans[ls(p)]));
ans6[p]=ans6[rs(p)]+(ans6[ls(p)]*(0==ans[rs(p)]));
ans7[p]=max(ans7[ls(p)],max(ans7[rs(p)],ans5[rs(p)]+ans6[ls(p)]));
ans7[p]=max(ans5[p],max(ans6[p],ans7[p]));
}
void build(ll p,ll l,ll r){
wyz[p].r=r;
wyz[p].id=p;
tag[p]=0;
if(l==r){
ans[p]=ans2[p]=ans3[p]=ans4[p]=a[l];
ans5[p]=ans6[p]=ans7[p]=!a[l];
return ;
}
ll mid=(l+r)>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
push_up(p,l,r);
}
void f(ll p,ll l,ll r,ll k,ll k2,ll k3){
if(k==1){
tag[p]=1;
tag2[p]=0;
tag3[p]=0;
ans2[p]=ans3[p]=ans4[p]=ans[p]=(r-l+1);
ans5[p]=ans6[p]=ans7[p]=0;
}
else if(k2==1){
tag[p]=0;
tag2[p]=1;
tag3[p]=0;
ans2[p]=ans3[p]=ans4[p]=ans[p]=0;
ans5[p]=ans6[p]=ans7[p]=(r-l+1);
}
else if(k3==1){
if(tag[p]>0){
tag[p]=0;
tag2[p]=1;
tag3[p]=0;
ans2[p]=ans3[p]=ans4[p]=ans[p]=0;
ans5[p]=ans6[p]=ans7[p]=(r-l+1);
return ;
}
else if(tag2[p]>0){
tag[p]=1;
tag2[p]=0;
tag3[p]=0;
ans2[p]=ans3[p]=ans4[p]=ans[p]=(r-l+1);
ans5[p]=ans6[p]=ans7[p]=0;
return ;
}
tag[p]=0;
tag2[p]=0;
tag3[p]++;
tag3[p]%=2;
ans[p]=(r-l+1)-ans[p];
swap(ans2[p],ans7[p]);
swap(ans3[p],ans5[p]);
swap(ans4[p],ans6[p]);
}
}
void push_down(ll p,ll l,ll r){
ll mid=(l+r)>>1;
f(ls(p),l,mid,tag[p],tag2[p],tag3[p]);
f(rs(p),mid+1,r,tag[p],tag2[p],tag3[p]);
tag[p]=tag2[p]=tag3[p]=0;
}
void update(ll p,ll l,ll r,ll ul,ll ur,ll k){
if(l==ul&&r==ur){
if(k==1){
tag[p]=1;
tag2[p]=0;
tag3[p]=0;
ans2[p]=ans3[p]=ans4[p]=ans[p]=(r-l+1);
ans5[p]=ans6[p]=ans7[p]=0;
}
else if(k==2){
tag[p]=0;
tag2[p]=1;
tag3[p]=0;
ans2[p]=ans3[p]=ans4[p]=ans[p]=0;
ans5[p]=ans6[p]=ans7[p]=(r-l+1);
}
else {
if(tag[p]>0){
tag[p]=0;
tag2[p]=1;
tag3[p]=0;
ans2[p]=ans3[p]=ans4[p]=ans[p]=0;
ans5[p]=ans6[p]=ans7[p]=(r-l+1);
return ;
}
else if(tag2[p]>0){
tag[p]=1;
tag2[p]=0;
tag3[p]=0;
ans2[p]=ans3[p]=ans4[p]=ans[p]=(r-l+1);
ans5[p]=ans6[p]=ans7[p]=0;
return ;
}
tag[p]=0;
tag2[p]=0;
tag3[p]+=1;
tag3[p]%=2;
ans[p]=(r-l+1)-ans[p];
swap(ans2[p],ans7[p]);
swap(ans3[p],ans5[p]);
swap(ans4[p],ans6[p]);
}
return ;
}
push_down(p,l,r);
ll mid=(l+r)>>1;
if(ul>mid)update(rs(p),mid+1,r,ul,ur,k);
else if(ur<=mid)update(ls(p),l,mid,ul,ur,k);
else {update(ls(p),l,mid,ul,mid,k);update(rs(p),mid+1,r,mid+1,ur,k);}
push_up(p,l,r);
}
ll fd(ll p,ll l,ll r,ll fl,ll fr){
if(l==fl&&r==fr)return ans[p];
push_down(p,l,r);
ll mid=(l+r)>>1;
if(fl>mid)return fd(rs(p),mid+1,r,fl,fr);
else if(fr<=mid)return fd(ls(p),l,mid,fl,fr);
else return fd(ls(p),l,mid,fl,mid)+fd(rs(p),mid+1,r,mid+1,fr);
}
ll jl[lm>>2],ljl=0;
void fd3(ll p,ll l,ll r,ll fl,ll fr){
if(l==fl&&r==fr){
jl[++ljl]=p;
return ;
}
push_down(p,l,r);
ll mid=(l+r)>>1;
if(fl>mid)fd3(rs(p),mid+1,r,fl,fr);
else if(fr<=mid)fd3(ls(p),l,mid,fl,fr);
else fd3(ls(p),l,mid,fl,mid),fd3(rs(p),mid+1,r,mid+1,fr);
}
bool cmp(node x,node y){
return x.r<y.r;
}
ll fd2(ll p,ll l,ll r,ll fl,ll fr){
//cout<<"HAHA";
ljl=0;ll sum=0;
fd3(p,l,r,fl,fr);
node nb[ljl+1];
//sort(jl+1,jl+ljl+1);
for(int i=1;i<=ljl;i++)nb[i].r=wyz[jl[i]].r,nb[i].id=jl[i],sum=max(sum,ans2[jl[i]]);
sort(nb+1,nb+ljl+1,cmp);
for(int i=1;i<=ljl;i++){
//sum=max(sum,ans2[jl[i]]);
ll sls=ans4[nb[i].id],j=i+1;
while(j<ljl&&ans7[j]==0)sls+=ans2[nb[i].id],j++;
if(ljl>1)sls+=ans3[nb[i].id];
sum=max(sum,sls);
i=j-1;
}
return sum;
}
int main(){
// freopen("P1438_2.in","r",stdin);
// freopen("1.txt","w",stdout);
n=rd();m=rd();
for(int i=1;i<=n;i++)a[i]=rd();
build(1,1,n);
// for(int i=1;i<=n<<2;i++){
// cout<<i<<"----"<<ans[i]<<" "<<ans2[i]<<" "<<ans3[i]<<" "<<ans4[i]<<" "<<ans5[i]<<" "<<ans6[i]<<" "<<ans7[i]<<endl;
// }
while(m--){
ll op=rd(),l=rd(),r=rd();
l++,r++;
if(op==0){
update(1,1,n,l,r,2);
}
else if(op==1){
//ll q=rd();
update(1,1,n,l,r,1);
}
else if(op==2)update(1,1,n,l,r,3);
else if(op==3)printf("%lld\n",fd(1,1,n,l,r));
else printf("%lld\n",fd2(1,1,n,l,r));
// for(int i=1;i<=n<<2;i++){
// cout<<i<<"----"<<ans[i]<<" "<<ans2[i]<<" "<<ans3[i]<<" "<<ans4[i]<<" "<<ans5[i]<<" "<<ans6[i]<<" "<<ans7[i]<<" "<<tag[i]<<" "<<tag2[i]<<" "<<tag3[i]<<endl;
// }
}
return 0;
}
by 我能自己爬了 @ 2022-02-10 19:44:59
找到了 你这个fd3的下标位置错了 改过来的就好了
by 我能自己爬了 @ 2022-02-10 19:45:26
@我能自己爬了 好的谢谢dalao QAQ
by 我能自己爬了 @ 2022-02-10 19:47:28
@我能自己爬了 呜呜呜呜呜终于A了