萌新刚学ds,能过样例,然而全WA,q求大佬看看怎么回事

P2572 [SCOI2010] 序列操作

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 谢谢


|