ShanLing @ 2024-07-23 20:45:12
#include <bits/stdc++.h>
using namespace std;
#define N 100005
int n,q;
struct node
{
int l,r,flag1,flag2,flag3,sum,lmax0,lmax1,rmax0,rmax1,max0,max1;
}t[N*4];
void pushup(int p,int l,int r)
{
t[p].sum=t[l].sum+t[r].sum;
if(t[l].lmax0==t[l].r-t[l].l+1)
t[p].lmax0=t[l].lmax0+t[r].lmax0;
else
t[p].lmax0=t[l].lmax0;
if(t[l].lmax1==t[l].r-t[l].l+1)
t[p].lmax1=t[l].lmax1+t[r].lmax1;
else
t[p].lmax1=t[l].lmax1;
if(t[r].rmax0==t[r].r-t[r].l+1)
t[p].rmax0=t[r].rmax0+t[l].rmax0;
else
t[p].rmax0=t[r].rmax0;
if(t[r].rmax1==t[r].r-t[r].l+1)
t[p].rmax1=t[r].rmax1+t[l].rmax1;
else
t[p].rmax1=t[r].rmax1;
t[p].max0=max(t[l].max0,t[r].max0);
t[p].max0=max(t[p].max0,t[l].rmax0+t[r].lmax0);
t[p].max1=max(t[l].max1,t[r].max1);
t[p].max1=max(t[p].max1,t[l].rmax1+t[r].lmax1);
}
void pushdown1(int p,int l,int r)
{
if(t[p].flag1)
{
t[l].flag2=0;
t[r].flag2=0;
t[l].flag3=0;
t[r].flag3=0;
t[l].flag1=1-t[l].flag1;
t[r].flag1=1-t[r].flag1;
t[l].sum=t[r].sum=0;
t[l].lmax0=t[l].r-t[l].l+1;
t[r].lmax0=t[r].r-t[r].l+1;
t[l].lmax1=t[r].lmax1=0;
t[l].rmax0=t[l].r-t[l].l+1;
t[r].rmax0=t[r].r-t[r].l+1;
t[l].rmax1=t[r].rmax1=0;
t[l].max0=t[l].r-t[l].l+1;
t[r].max0=t[r].r-t[r].l+1;
t[l].max1=t[r].max1=0;
t[p].flag1=0;
}
}
void pushdown2(int p,int l,int r)
{
if(t[p].flag2)
{
t[l].flag1=0;
t[r].flag1=0;
t[l].flag3=0;
t[r].flag3=0;
t[l].flag2=1-t[l].flag2;
t[r].flag2=1-t[r].flag2;
t[l].sum=t[l].r-t[l].l+1;
t[r].sum=t[r].r-t[r].l+1;
t[l].lmax0=t[r].lmax0=0;
t[l].lmax1=t[l].r-t[l].l+1;
t[r].lmax1=t[r].r-t[r].l+1;
t[l].rmax0=t[r].rmax0=0;
t[l].rmax1=t[l].r-t[l].l+1;
t[r].rmax1=t[r].r-t[r].l+1;
t[l].max0=t[r].max0=0;
t[l].max1=t[l].r-t[l].l+1;
t[r].max1=t[r].r-t[r].l+1;
t[p].flag2=0;
}
}
void pushdown3(int p,int l,int r)
{
if(t[p].flag3)
{
t[l].flag3=1-t[l].flag3;
t[r].flag3=1-t[r].flag3;
t[l].sum=t[l].r-t[l].l+1-t[l].sum;
t[r].sum=t[r].r-t[r].l+1-t[r].sum;
swap(t[l].lmax0,t[l].lmax1);
swap(t[r].lmax0,t[r].lmax1);
swap(t[l].rmax0,t[l].rmax1);
swap(t[r].rmax0,t[r].rmax1);
swap(t[l].max0,t[l].max1);
swap(t[r].max0,t[r].max1);
t[p].flag3=0;
}
}
void pushdown(int p)
{
pushdown1(p,p*2,p*2+1);
pushdown2(p,p*2,p*2+1);
pushdown3(p,p*2,p*2+1);
}
void build(int p,int l,int r)
{
t[p].l=l;
t[p].r=r;
if(l==r)
{
scanf("%d",&t[p].sum);
if(t[p].sum)
t[p].lmax1=t[p].rmax1=t[p].max1=1;
else
t[p].lmax0=t[p].rmax0=t[p].max0=1;
return;
}
int mid=(l+r)>>1;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
pushup(p,p*2,p*2+1);
}
void change1(int p,int l,int r)
{
if(t[p].l>=l && t[p].r<=r)
{
t[p].flag2=0;
t[p].flag3=0;
t[p].flag1=1-t[p].flag1;
t[p].sum=0;
t[p].lmax0=t[p].rmax0=t[p].max0=t[p].r-t[p].l+1;
t[p].lmax1=t[p].rmax1=t[p].max1=0;
return;
}
pushdown(p);
int mid=(t[p].l+t[p].r)>>1;
if(mid>=l)
change1(p*2,l,r);
if(mid<r)
change1(p*2+1,l,r);
pushup(p,p*2,p*2+1);
}
void change2(int p,int l,int r)
{
if(t[p].l>=l && t[p].r<=r)
{
t[p].flag1=0;
t[p].flag3=0;
t[p].flag2=1-t[p].flag2;
t[p].sum=t[p].r-t[p].l+1;
t[p].lmax0=t[p].rmax0=t[p].max0=0;
t[p].lmax1=t[p].rmax1=t[p].max1=t[p].r-t[p].l+1;
return;
}
pushdown(p);
int mid=(t[p].l+t[p].r)>>1;
if(mid>=l)
change2(p*2,l,r);
if(mid<r)
change2(p*2+1,l,r);
pushup(p,p*2,p*2+1);
}
void change3(int p,int l,int r)
{
if(t[p].l>=l && t[p].r<=r)
{
t[p].flag3=1-t[p].flag3;
t[p].sum=t[p].r-t[p].l+1-t[p].sum;
swap(t[p].lmax0,t[p].lmax1);
swap(t[p].rmax0,t[p].rmax1);
swap(t[p].max0,t[p].max1);
return;
}
pushdown(p);
int mid=(t[p].l+t[p].r)>>1;
if(mid>=l)
change3(p*2,l,r);
if(mid<r)
change3(p*2+1,l,r);
pushup(p,p*2,p*2+1);
}
int query1(int p,int l,int r)
{
if(t[p].l>=l && t[p].r<=r)
return t[p].sum;
pushdown(p);
int mid=(t[p].l+t[p].r)>>1,sum=0;
if(mid>=l)
sum+=query1(p*2,l,r);
if(mid<r)
sum+=query1(p*2+1,l,r);
return sum;
}
node query2(int p,int l,int r)
{
if(t[p].l>=l && t[p].r<=r)
return t[p];
pushdown(p);
int mid=(t[p].l+t[p].r)>>1;
if(mid>=r)
return query2(p*2,l,r);
else if(mid<l)
return query2(p*2+1,l,r);
else
{
node ans1=query2(p*2,l,r);
node ans2=query2(p*2+1,l,r);
node ans3;
if(ans1.lmax0==ans1.r-ans1.l+1)
ans3.lmax0=ans1.lmax0+ans2.lmax0;
else
ans3.lmax0=ans1.lmax0;
if(ans1.lmax1==ans1.r-ans1.l+1)
ans3.lmax1=ans1.lmax1+ans2.lmax1;
else
ans3.lmax1=ans1.lmax1;
if(ans2.rmax0==ans2.r-ans2.l+1)
ans3.rmax0=ans2.rmax0+ans1.rmax0;
else
ans3.rmax0=ans2.rmax0;
if(ans2.rmax1==ans2.r-ans2.l+1)
ans3.rmax1=ans2.rmax1+ans1.rmax1;
else
ans3.rmax1=ans2.rmax1;
ans3.max0=max(ans1.max0,ans2.max0);
ans3.max0=max(ans3.max0,ans1.rmax0+ans2.lmax0);
ans3.max1=max(ans1.max1,ans2.max1);
ans3.max1=max(ans3.max1,ans1.rmax1+ans2.lmax1);
return ans3;
}
}
int main( void )
{
scanf("%d%d",&n,&q);
build(1,1,n);
while(q--)
{
int opt,l,r;
scanf("%d%d%d",&opt,&l,&r);
l++;r++;
if(opt==0)
change1(1,l,r);
else if(opt==1)
change2(1,l,r);
else if(opt==2)
change3(1,l,r);
else if(opt==3)
printf("%d\n",query1(1,l,r));
else
printf("%d\n",query2(1,l,r).max1);
}
return 0;
}
by pugong @ 2024-08-09 21:36:55
@ShanLing 给你组数据
输入:
7 5
0 0 1 1 0 1 0
1 4 6
1 0 6
3 6 6
3 3 6
0 6 6
输出
1
4
by ShanLing @ 2024-08-10 10:51:49
@pugong 感谢,已关