AuKr @ 2020-05-08 07:53:21
Rt,code:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define read(x) scanf("%d",&x)
#define MAXN 100005
int n,m,flag,l,r;
int t[MAXN];
struct node
{
int sum[2],pre[2],suf[2],res[2];
int lazy[3],l,r;
node()
{
sum[0]=pre[0]=suf[0]=res[0]=0;
sum[1]=pre[1]=suf[1]=res[1]=0;
lazy[0]=lazy[1]=lazy[2]=0;
l=r=0;
}
}a[MAXN<<2];
void update(int k)
{
a[k].sum[0]=a[k<<1].sum[0]+a[k<<1|1].sum[0];
a[k].sum[1]=a[k<<1].sum[1]+a[k<<1|1].sum[1];
if(a[k<<1].pre[0]==a[k<<1].r-a[k<<1].l+1) a[k].pre[0]=a[k<<1].pre[0]+a[k<<1|1].pre[0];
else a[k].pre[0]=a[k<<1].pre[0];
if(a[k<<1].pre[1]==a[k<<1].r-a[k<<1].l+1) a[k].pre[1]=a[k<<1].pre[1]+a[k<<1|1].pre[1];
else a[k].pre[1]=a[k<<1].pre[1];
if(a[k<<1|1].suf[0]==a[k<<1|1].r-a[k<<1|1].l+1) a[k].suf[0]=a[k<<1|1].suf[0]+a[k<<1].suf[0];
else a[k].suf[0]=a[k<<1|1].suf[0];
if(a[k<<1|1].suf[1]==a[k<<1|1].r-a[k<<1|1].l+1) a[k].suf[1]=a[k<<1|1].suf[1]+a[k<<1].suf[1];
else a[k].suf[1]=a[k<<1|1].suf[1];
a[k].res[0]=max(a[k<<1].res[0],max(a[k<<1|1].res[0],max(a[k].suf[0],max(a[k].pre[0],a[k<<1].suf[0]+a[k<<1|1].pre[0]))));
a[k].res[1]=max(a[k<<1].res[1],max(a[k<<1|1].res[1],max(a[k].suf[1],max(a[k].pre[1],a[k<<1].suf[1]+a[k<<1|1].pre[1]))));
}
void build(int k,int l,int r)
{
a[k].l=l,a[k].r=r;
if(l==r)
{
a[k].sum[0]=(t[l]==0)?1:0;
a[k].sum[1]=1-a[k].sum[0];
a[k].res[0]=a[k].suf[0]=a[k].pre[0]=a[k].sum[0];
a[k].res[1]=a[k].suf[1]=a[k].pre[1]=a[k].sum[1];
return;
}
int mid=(l+r)>>1;
build(k<<1,l,mid),build(k<<1|1,mid+1,r);
update(k);
}
void lazydown(int k)
{
if(a[k].l==a[k].r){a[k].lazy[0]=a[k].lazy[1]=a[k].lazy[2]=0;return;}
if(a[k].lazy[0]==1)
{
a[k<<1].res[0]=a[k<<1].suf[0]=a[k<<1].pre[0]=a[k<<1].sum[0]=a[k<<1].r-a[k<<1].l+1;
a[k<<1|1].res[0]=a[k<<1|1].suf[0]=a[k<<1|1].pre[0]=a[k<<1|1].sum[0]=a[k<<1|1].r-a[k<<1|1].l+1;
a[k<<1].res[1]=a[k<<1].suf[1]=a[k<<1].pre[1]=a[k<<1].sum[1]=0;
a[k<<1|1].res[1]=a[k<<1|1].suf[1]=a[k<<1|1].pre[1]=a[k<<1|1].sum[1]=0;
a[k<<1].lazy[0]=a[k<<1|1].lazy[0]=1;
}
if(a[k].lazy[1]==1)
{
a[k<<1].res[1]=a[k<<1].suf[1]=a[k<<1].pre[1]=a[k<<1].sum[1]=a[k<<1].r-a[k<<1].l+1;
a[k<<1|1].res[1]=a[k<<1|1].suf[1]=a[k<<1|1].pre[1]=a[k<<1|1].sum[1]=a[k<<1|1].r-a[k<<1|1].l+1;
a[k<<1].res[0]=a[k<<1].suf[0]=a[k<<1].pre[0]=a[k<<1].sum[0]=0;
a[k<<1|1].res[0]=a[k<<1|1].suf[0]=a[k<<1|1].pre[0]=a[k<<1|1].sum[0]=0;
a[k<<1].lazy[1]=a[k<<1|1].lazy[1]=1;
}
if(a[k].lazy[2]==1)
{
swap(a[k<<1].suf[0],a[k<<1].suf[1]);
swap(a[k<<1].pre[0],a[k<<1].pre[1]);
swap(a[k<<1].sum[0],a[k<<1].sum[1]);
swap(a[k<<1].res[0],a[k<<1].res[1]);
swap(a[k<<1|1].suf[0],a[k<<1|1].suf[1]);
swap(a[k<<1|1].pre[0],a[k<<1|1].pre[1]);
swap(a[k<<1|1].sum[0],a[k<<1|1].sum[1]);
swap(a[k<<1|1].res[0],a[k<<1|1].res[1]);
a[k<<1].lazy[2]=a[k<<1|1].lazy[2]=1;
}
a[k].lazy[0]=a[k].lazy[1]=a[k].lazy[2]=0;
return;
}
void to0(int k,int l,int r)
{
if(a[k].lazy[0]||a[k].lazy[1]||a[k].lazy[2]) lazydown(k);
if(a[k].l==l&&a[k].r==r)
{
a[k].lazy[0]=1;
a[k].suf[0]=a[k].pre[0]=a[k].sum[0]=a[k].res[0]=a[k].r-a[k].l+1;
a[k].suf[1]=a[k].pre[1]=a[k].sum[1]=a[k].res[1]=0;
return;
}
int mid=(a[k].l+a[k].r)>>1;
if(r<=mid) to0(k<<1,l,r);
else if(l>mid) to0(k<<1|1,l,r);
else to0(k<<1,l,mid),to0(k<<1|1,mid+1,r);
update(k);
}
void to1(int k,int l,int r)
{
if(a[k].lazy[0]||a[k].lazy[1]||a[k].lazy[2]) lazydown(k);
if(a[k].l==l&&a[k].r==r)
{
a[k].lazy[1]=1;
a[k].suf[1]=a[k].pre[1]=a[k].sum[1]=a[k].res[1]=a[k].r-a[k].l+1;
a[k].suf[0]=a[k].pre[0]=a[k].sum[0]=a[k].res[0]=0;
return;
}
int mid=(a[k].l+a[k].r)>>1;
if(r<=mid) to1(k<<1,l,r);
else if(l>mid) to1(k<<1|1,l,r);
else to1(k<<1,l,mid),to1(k<<1|1,mid+1,r);
update(k);
}
void turn(int k,int l,int r)
{
if(a[k].lazy[0]||a[k].lazy[1]||a[k].lazy[2]) lazydown(k);
if(a[k].l==l&&a[k].r==r)
{
a[k].lazy[2]=1;
swap(a[k].suf[0],a[k].suf[1]);
swap(a[k].pre[0],a[k].pre[1]);
swap(a[k].sum[0],a[k].sum[1]);
swap(a[k].res[0],a[k].res[1]);
return;
}
int mid=(a[k].l+a[k].r)>>1;
if(r<=mid) turn(k<<1,l,r);
else if(l>mid) turn(k<<1|1,l,r);
else turn(k<<1,l,mid),turn(k<<1|1,mid+1,r);
update(k);
}
int query1(int k,int l,int r)
{
if(a[k].lazy[0]||a[k].lazy[1]||a[k].lazy[2]) lazydown(k);
if(a[k].l==l&&a[k].r==r) return a[k].sum[1];
int mid=(a[k].l+a[k].r)>>1;
if(r<=mid) return query1(k<<1,l,r);
else if(l>mid) return query1(k<<1|1,l,r);
else return query1(k<<1,l,mid)+query1(k<<1|1,mid+1,r);
}
node query2(int k,int l,int r)
{
if(a[k].lazy[0]||a[k].lazy[1]||a[k].lazy[2]) lazydown(k);
if(a[k].l==l&&a[k].r==r) return a[k];
int mid=(a[k].l+a[k].r)>>1;
if(r<=mid) return query2(k<<1,l,r);
else if(l>mid) return query2(k<<1|1,l,r);
else
{
node ll,rr,ans;
ll=query2(k<<1,l,mid),rr=query2(k<<1|1,mid+1,r);
ans.l=l,ans.r=r;
ans.sum[1]=ll.sum[1]+rr.sum[1];
if(ll.pre[1]==ll.r-ll.l+1) ans.pre[1]=ll.pre[1]+rr.pre[1];
else ans.pre[1]=ll.pre[1];
if(rr.suf[1]==rr.r-rr.l+1) ans.suf[1]=rr.suf[1]+ll.suf[1];
else ans.suf[1]=rr.suf[1];
ans.res[1]=max(ll.res[1],max(rr.res[1],max(ans.suf[1],max(ans.pre[1],ll.suf[1]+rr.pre[1]))));
return ans;
}
}
int main()
{
read(n),read(m);
for(int i=1;i<=n;i++) read(t[i]);
build(1,1,n);
for(int j=1;j<=m;j++)
{
read(flag),read(l),read(r);
l+=1,r+=1;
if(flag==0) to0(1,l,r);
else if(flag==1) to1(1,l,r);
else if(flag==2) turn(1,l,r);
else if(flag==3) printf("%d\n",query1(1,l,r));
else printf("%d\n",query2(1,l,r).res[1]);
}
return 0;
}
by bovine__kebi @ 2020-05-08 08:14:48
qndmx
by lndjy @ 2020-05-08 08:17:38
丢个AC代码吧QAQ
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int inline read()
{
int ans=0,f=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(isdigit(ch))
{
ans=ans*10+ch-'0';
ch=getchar();
}
return ans*f;
}
struct tree
{
int l,r;
int len;
int sum,lmax[2],rmax[2],amax[2];
int lazy;
}t[400005];
int n,m,a[100005];
void pushup(int k)
{
t[k].sum=t[k*2].sum+t[k*2+1].sum;
for(int i=0;i<=1;i++)
{
t[k].lmax[i]=(t[k*2].lmax[i]==t[k*2].len?t[k*2].lmax[i]+t[k*2+1].lmax[i]:t[k*2].lmax[i]);
t[k].rmax[i]=(t[k*2+1].rmax[i]==t[k*2+1].len?t[k*2+1].rmax[i]+t[k*2].rmax[i]:t[k*2+1].rmax[i]);
t[k].amax[i]=max(t[k*2].amax[i],max(t[k*2+1].amax[i],t[k*2].rmax[i]+t[k*2+1].lmax[i]));
}
}
void pushdown(int k)
{
if(t[k].lazy==0)
{
t[k*2].sum=t[k*2].lmax[1]=t[k*2].rmax[1]=t[k*2].amax[1]=t[k*2].lazy=0;
t[k*2+1].sum=t[k*2+1].lmax[1]=t[k*2+1].rmax[1]=t[k*2+1].amax[1]=t[k*2+1].lazy=0;
t[k*2].lmax[0]=t[k*2].rmax[0]=t[k*2].amax[0]=t[k*2].len;
t[k*2+1].lmax[0]=t[k*2+1].rmax[0]=t[k*2+1].amax[0]=t[k*2+1].len;
}
if(t[k].lazy==1)
{
t[k*2].sum=t[k*2].amax[1]=t[k*2].lmax[1]=t[k*2].rmax[1]=t[k*2].len;
t[k*2+1].sum=t[k*2+1].amax[1]=t[k*2+1].lmax[1]=t[k*2+1].rmax[1]=t[k*2+1].len;
t[k*2].lazy=t[k*2+1].lazy=1;
t[k*2].lmax[0]=t[k*2].rmax[0]=t[k*2].amax[0]=0;
t[k*2+1].lmax[0]=t[k*2+1].rmax[0]=t[k*2+1].amax[0]=0;
}
if(t[k].lazy==2)
{
t[k*2].sum=t[k*2].len-t[k*2].sum;
t[k*2+1].sum=t[k*2+1].len-t[k*2+1].sum;
if(t[k*2].lazy==2) t[k*2].lazy=-1;
else if(t[k*2].lazy==-1) t[k*2].lazy=2;
else if(t[k*2].lazy==1) t[k*2].lazy=0;
else t[k*2].lazy=1;
if(t[k*2+1].lazy==2) t[k*2+1].lazy=-1;
else if(t[k*2+1].lazy==-1) t[k*2+1].lazy=2;
else if(t[k*2+1].lazy==1) t[k*2+1].lazy=0;
else t[k*2+1].lazy=1;
swap(t[k*2].lmax[0],t[k*2].lmax[1]);swap(t[k*2].rmax[0],t[k*2].rmax[1]);swap(t[k*2].amax[0],t[k*2].amax[1]);
swap(t[k*2+1].lmax[0],t[k*2+1].lmax[1]);swap(t[k*2+1].rmax[0],t[k*2+1].rmax[1]);swap(t[k*2+1].amax[0],t[k*2+1].amax[1]);
}
t[k].lazy=-1;
}
void build(int l,int r,int k)
{
t[k].l=l;t[k].r=r;t[k].len=r-l+1;
t[k].lazy=-1;
if(l==r)
{
t[k].sum=a[l];
t[k].lmax[a[l]]=t[k].rmax[a[l]]=t[k].amax[a[l]]=1;
return;
}
int mid=(l+r)/2;
build(l,mid,k*2);
build(mid+1,r,k*2+1);
pushup(k);
}
void change(int l,int r,int k,int v)
{
if(l<=t[k].l&&t[k].r<=r)
{
if(v==0) t[k].sum=0;
else t[k].sum=t[k].len;
t[k].lazy=v;
t[k].lmax[v]=t[k].rmax[v]=t[k].amax[v]=t[k].len;
t[k].lmax[!v]=t[k].rmax[!v]=t[k].amax[!v]=0;
return;
}
pushdown(k);
if(t[k*2].r>=l)
change(l,r,k*2,v);
if(t[k*2+1].l<=r)
change(l,r,k*2+1,v);
pushup(k);
}
void no(int l,int r,int k)
{
if(l<=t[k].l&&t[k].r<=r)
{
t[k].sum=t[k].len-t[k].sum;
swap(t[k].lmax[0],t[k].lmax[1]);swap(t[k].rmax[0],t[k].rmax[1]);swap(t[k].amax[0],t[k].amax[1]);
if(t[k].lazy==2) t[k].lazy=-1;
else if(t[k].lazy==-1) t[k].lazy=2;
else if(t[k].lazy==1) t[k].lazy=0;
else t[k].lazy=1;
return;
}
pushdown(k);
if(t[k*2].r>=l)
no(l,r,k*2);
if(t[k*2+1].l<=r)
no(l,r,k*2+1);
pushup(k);
}
int ask(int l,int r,int k)
{
if(l<=t[k].l&&t[k].r<=r)
return t[k].sum;
pushdown(k);
int ans=0;
if(t[k*2].r>=l)
ans+=ask(l,r,k*2);
if(t[k*2+1].l<=r)
ans+=ask(l,r,k*2+1);
return ans;
}
int askmax(int l,int r,int k)
{
if(t[k].l>r||t[k].r<l) return 0;
if(l<=t[k].l&&t[k].r<=r) return t[k].amax[1];
pushdown(k);
return max(askmax(l,r,k*2),max(askmax(l,r,k*2+1),min(t[k*2].rmax[1],t[k*2].r-l+1)+min(t[k*2+1].lmax[1],r-t[k*2+1].l+1)));
}
int main()
{
n=read();m=read();
for(int i=1;i<=n;i++)
a[i]=read();
build(1,n,1);
for(int i=1;i<=m;i++)
{
int op=read(),l=read()+1,r=read()+1;
if(op<=1) change(l,r,1,op);
if(op==2) no(l,r,1);
if(op==3) cout<<ask(l,r,1)<<'\n';
if(op==4) cout<<askmax(l,r,1)<<'\n';
}
return 0;
}
by Limit @ 2020-05-08 08:20:37
序列操作还是自己写吧/fad
by AuKr @ 2020-05-08 08:27:14
@水题淹死的鱼 谢谢
by CreeperLordVader @ 2020-05-08 08:41:09
@AuKr 代码就不看了,跟您说说我做这题debug的方法给您参考一下
先对拍找一组出错数据,然后找到出错的那个询问,对这个询问之前的所有修改操作,输出修改后的序列然后检查对不对,挺有效果
另外还可能遇到一种情况,就是输出序列之后原本错误的答案又正确了,这时候检查一下下推标记的过程有没有问题
by AuKr @ 2020-05-08 13:49:26
@CreeperLordVader 谢谢