MorLeaves @ 2024-05-08 18:03:56
#include<iostream>
#include<cstdio>
#define ls p<<1
#define rs p<<1|1
const int N=114514;
using namespace std;
int n,m,a[N],op,x,y;
struct node {
int l,r,sum,tag1,tag2,lmax1,rmax1,lmax0,rmax0,max1,max0,len;
}tr[N<<2];
void push_up(int p)
{
tr[p].sum=tr[ls].sum+tr[rs].sum;
tr[p].lmax1=(tr[ls].sum==tr[ls].len)?tr[ls].sum+tr[rs].lmax1:tr[ls].lmax1;
tr[p].rmax1=(tr[rs].sum==tr[rs].len)?tr[rs].sum+tr[ls].rmax1:tr[rs].rmax1;
tr[p].lmax0=(tr[ls].max0==tr[ls].len)?tr[ls].len+tr[rs].lmax0:tr[ls].lmax0;
tr[p].rmax0=(tr[rs].max0==tr[rs].len)?tr[rs].len+tr[ls].rmax0:tr[rs].rmax0;
tr[p].max1=max(tr[ls].rmax1+tr[rs].lmax1,max(tr[ls].max1,tr[rs].max1));
tr[p].max0=max(tr[ls].rmax0+tr[rs].lmax0,max(tr[ls].max0,tr[rs].max0));
}
void push_down(int p)
{
if (tr[p].tag1)
{
tr[ls].sum=tr[ls].lmax1=tr[ls].rmax1=tr[ls].max1=tr[ls].len*(tr[p].tag1-1);
tr[ls].lmax0=tr[ls].rmax0=tr[ls].max0=tr[ls].len*((tr[p].tag1-1)^1);
tr[ls].tag1=tr[p].tag1;
tr[rs].sum=tr[rs].lmax1=tr[rs].rmax1=tr[rs].max1=tr[rs].len*(tr[p].tag1-1);
tr[rs].lmax0=tr[rs].rmax0=tr[rs].max0=tr[rs].len*((tr[p].tag1-1)^1);
tr[rs].tag1=tr[p].tag1;
tr[p].tag1=tr[ls].tag2=tr[rs].tag2=0;
}
if (tr[p].tag2)
{
tr[ls].sum=tr[ls].len-tr[ls].sum;
swap(tr[ls].lmax1,tr[ls].lmax0);
swap(tr[ls].rmax1,tr[ls].rmax0);
swap(tr[ls].max1,tr[ls].max0);
if (tr[ls].tag1==1)
{
tr[ls].tag1=2;
}
else if (tr[ls].tag1==2)
{
tr[ls].tag1=1;
}
else
{
tr[ls].tag2^=1;
}
tr[rs].sum=tr[rs].len-tr[rs].sum;
swap(tr[rs].lmax1,tr[rs].lmax0);
swap(tr[rs].rmax1,tr[rs].rmax0);
swap(tr[rs].max1,tr[rs].max0);
if (tr[rs].tag1==1)
{
tr[rs].tag1=2;
}
else if (tr[rs].tag1==2)
{
tr[rs].tag1=1;
}
else
{
tr[rs].tag2^=1;
}
tr[p].tag2=0;
}
}
void build(int s,int t,int p)
{
tr[p].l=s;
tr[p].r=t;
tr[p].len=t-s+1;
if (s==t)
{
tr[p].sum=tr[p].lmax1=tr[p].rmax1=tr[p].max1=a[s];
tr[p].lmax0=tr[p].rmax0=tr[p].max0=(a[s]^1);
return ;
}
int mid=s+((t-s)>>1);
build(s,mid,ls);
build(mid+1,t,rs);
push_up(p);
}
void upd1(int s,int t,int p)
{
if (s<=tr[p].l&&tr[p].r<=t)
{
tr[p].sum=tr[p].lmax1=tr[p].rmax1=tr[p].max1=0;
tr[p].lmax0=tr[p].rmax0=tr[p].max0=tr[p].len;
tr[p].tag1=1;
tr[p].tag2=0;
return ;
}
push_down(p);
int mid=tr[p].l+((tr[p].r-tr[p].l)>>1);
if (s<=mid)
{
upd1(s,t,ls);
}
if (t>mid)
{
upd1(s,t,rs);
}
push_up(p);
}
void upd2(int s,int t,int p)
{
if (s<=tr[p].l&&tr[p].r<=t)
{
tr[p].sum=tr[p].lmax1=tr[p].rmax1=tr[p].max1=tr[p].len;
tr[p].lmax0=tr[p].rmax0=tr[p].max0=0;
tr[p].tag1=2;
tr[p].tag2=0;
return ;
}
push_down(p);
int mid=tr[p].l+((tr[p].r-tr[p].l)>>1);
if (s<=mid)
{
upd2(s,t,ls);
}
if (t>mid)
{
upd2(s,t,rs);
}
push_up(p);
}
void upd3(int s,int t,int p)
{
if (s<=tr[p].l&&tr[p].r<=t)
{
tr[p].sum=tr[p].len-tr[p].sum;
swap(tr[p].lmax1,tr[p].lmax0);
swap(tr[p].rmax1,tr[p].rmax0);
swap(tr[p].max1,tr[p].max0);
if (tr[p].tag1==1)
{
tr[p].tag1=2;
}
else if (tr[p].tag1==2)
{
tr[p].tag1=1;
}
else
{
tr[p].tag2=!tr[p].tag2;
}
return ;
}
push_down(p);
int mid=tr[p].l+((tr[p].r-tr[p].l)>>1);
if (s<=mid)
{
upd3(s,t,ls);
}
if (t>mid)
{
upd3(s,t,rs);
}
push_up(p);
}
int getsum(int s,int t,int p)
{
if (s<=tr[p].l&&tr[p].r<=t)
{
return tr[p].sum;
}
push_down(p);
int mid=tr[p].l+((tr[p].r-tr[p].l)>>1),ans=0;
if (s<=mid)
{
ans+=getsum(s,t,ls);
}
if (t>mid)
{
ans+=getsum(s,t,rs);
}
return ans;
}
int getmaxn(int s,int t,int p)
{
if (s<=tr[p].l&&tr[p].r<=t)
{
return tr[p].max1;
}
push_down(p);
int mid=tr[p].l+((tr[p].r-tr[p].l)>>1),ans=-2147483647;
if (s<=mid)
{
ans=max(ans,getmaxn(s,t,ls));
}
if (t>mid)
{
ans=max(ans,getmaxn(s,t,rs));
}
return ans;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
build(1,n,1);
while(m--)
{
scanf("%d %d %d",&op,&x,&y);
x++,y++;
if (op==0)
{
upd1(x,y,1);
}
else if (op==1)
{
upd2(x,y,1);
}
else if (op==2)
{
upd3(x,y,1);
}
else if (op==3)
{
printf("%d\n",getsum(x,y,1));
}
else
{
printf("%d\n",getmaxn(x,y,1));
}
}
return 0;
}
by ydkxj @ 2024-05-08 18:20:41
wc %%% bx/
by luxiaomao @ 2024-09-05 21:42:14
@MorLeaves 您写的题我四个月后才写啊 /bx
by MorLeaves @ 2024-09-05 22:27:45
@luxiaomao 给我假