萌新 hack 数据和样例过了,数据一个也没过求调

P2572 [SCOI2010] 序列操作

wukaichen888 @ 2023-01-19 12:22:25

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,q,a[N];
struct node{
    int len,sum0,sum1,lmax0,rmax0,maxx0,lmax1,rmax1,maxx1;
    bool tag1,tag2,tag3;
}tree[N<<2];
#define k1 k<<1
#define k2 k<<1|1
#define ls k<<1,l,mid
#define rs k<<1|1,mid+1,r
void add(int k,int l,int r,int d){
    if(!d){
        tree[k].tag1=1;
        tree[k].tag2=tree[k].tag3=0;
        tree[k].sum0=tree[k].lmax0=tree[k].rmax0=tree[k].maxx0=tree[k].len;
        tree[k].sum1=tree[k].lmax1=tree[k].rmax1=tree[k].maxx1=0;
    }
    if(d==1){
        tree[k].tag2=1;
        tree[k].tag1=tree[k].tag3=0;
        tree[k].sum0=tree[k].lmax0=tree[k].rmax0=tree[k].maxx0=0;
        tree[k].sum1=tree[k].lmax1=tree[k].rmax1=tree[k].maxx1=tree[k].len;
    }
    if(d==2){
        tree[k].tag3^=1;
        swap(tree[k].sum0,tree[k].sum1);
        swap(tree[k].lmax0,tree[k].lmax1);
        swap(tree[k].rmax0,tree[k].rmax1);
        swap(tree[k].maxx0,tree[k].maxx1);
    }
}
void pushdown(int k,int l,int r){
    int mid=(l+r)>>1;
    if(tree[k].tag1){
        add(ls,0);
        add(rs,0);
        tree[k].tag1=0;
    }
    if(tree[k].tag2){
        add(ls,1);
        add(rs,1);
        tree[k].tag2=0;
    }
    if(tree[k].tag3){
        add(ls,2);
        add(rs,2);
        tree[k].tag3=0;
    }
}
node pushup(node x,node y){
    node z;
    z.len=x.len+y.len;
    z.sum0=x.sum0+y.sum0;
    z.sum1=x.sum1+y.sum1;
    z.lmax0=x.lmax0;
    if(x.sum0==x.len)
        z.lmax0=x.len+y.lmax0;
    z.lmax1=x.lmax1;
    if(x.sum1==x.len)
        z.lmax1=x.len+y.lmax1;
    z.rmax0=y.rmax0;
    if(y.sum0==y.len)
        z.rmax0=y.len+x.rmax0;
    z.rmax1=y.rmax1;
    if(y.sum1==y.len)
        z.rmax1=y.len+x.rmax1;
    z.maxx0=x.rmax0+y.lmax0;
    z.maxx1=x.rmax1+y.lmax1;
    z.tag1=z.tag2=z.tag3=0;
    return z;
}
void pre(int k,int l,int r){
    tree[k].len=r-l+1;
    if(l==r){
        add(k,l,r,a[l]);
        return ;
    }
    int mid=(l+r)>>1;
    pre(ls);
    pre(rs);
    tree[k]=pushup(tree[k<<1],tree[k<<1|1]);
}
void change1(int k,int l,int r,int x,int y,int d){
    if(x<=l&&r<=y){
        add(k,l,r,d);
        return ;
    }
    int mid=(l+r)>>1;
    pushdown(k,l,r);
    if(x<=mid)
        change1(ls,x,y,d);
    if(mid<y)
        change1(rs,x,y,d);
    tree[k]=pushup(tree[k<<1],tree[k<<1|1]);
}
node query(int k,int l,int r,int x,int y){
    if(x<=l&&r<=y)
        return tree[k];
    int mid=(l+r)>>1;
    pushdown(k,l,r);
    if(x<=mid&&mid<y)
        return pushup(query(ls,x,y),query(rs,x,y));
    if(x<=mid)
        return query(ls,x,y);
    if(mid<y)
        return query(rs,x,y);
}
int main(){
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    pre(1,1,n);
    int op,x,y;
    while(q--){
        scanf("%d%d%d",&op,&x,&y);
        x++,y++;
        if(op<3)
            change1(1,1,n,x,y,op);
        else
            if(op==3)
                printf("%d\n",query(1,1,n,x,y).sum1);
            else
                if(op==4) 
                    printf("%d\n",query(1,1,n,x,y).maxx1);
    }
    return 0;
}

by wukaichen888 @ 2023-01-19 13:02:28

出金惹!啊 ... 不对,AC 惹!

z.maxx0=x.rmax0+y.lmax0;
z.maxx1=x.rmax1+y.lmax1;

改成

z.maxx0=max({x.maxx0,y.maxx0,x.rmax0+y.lmax0});
z.maxx1=max({x.maxx1,y.maxx1,x.rmax1+y.lmax1});

by wukaichen888 @ 2023-01-19 13:03:49

一下是 AC 代码

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,q,a[N];
struct node{
    int len,sum0,sum1,lmax0,rmax0,maxx0,lmax1,rmax1,maxx1;
    bool tag1,tag2,tag3;
}tree[N<<2];
#define k1 k<<1
#define k2 k<<1|1
#define ls k<<1,l,mid
#define rs k<<1|1,mid+1,r
void add(int k,int l,int r,int d){
    if(!d){
        tree[k].tag1=1;
        tree[k].tag2=tree[k].tag3=0;
        tree[k].sum0=tree[k].lmax0=tree[k].rmax0=tree[k].maxx0=tree[k].len;
        tree[k].sum1=tree[k].lmax1=tree[k].rmax1=tree[k].maxx1=0;
    }
    if(d==1){
        tree[k].tag2=1;
        tree[k].tag1=tree[k].tag3=0;
        tree[k].sum0=tree[k].lmax0=tree[k].rmax0=tree[k].maxx0=0;
        tree[k].sum1=tree[k].lmax1=tree[k].rmax1=tree[k].maxx1=tree[k].len;
    }
    if(d==2){
        tree[k].tag3^=1;
        swap(tree[k].sum0,tree[k].sum1);
        swap(tree[k].lmax0,tree[k].lmax1);
        swap(tree[k].rmax0,tree[k].rmax1);
        swap(tree[k].maxx0,tree[k].maxx1);
    }
}
void pushdown(int k,int l,int r){
    int mid=(l+r)>>1;
    if(tree[k].tag1){
        add(ls,0);
        add(rs,0);
        tree[k].tag1=0;
    }
    if(tree[k].tag2){
        add(ls,1);
        add(rs,1);
        tree[k].tag2=0;
    }
    if(tree[k].tag3){
        add(ls,2);
        add(rs,2);
        tree[k].tag3=0;
    }
}
node pushup(node x,node y){
    node z;
    z.len=x.len+y.len;
    z.sum0=x.sum0+y.sum0;
    z.sum1=x.sum1+y.sum1;
    z.lmax0=x.lmax0;
    if(x.sum0==x.len)
        z.lmax0=x.len+y.lmax0;
    z.lmax1=x.lmax1;
    if(x.sum1==x.len)
        z.lmax1=x.len+y.lmax1;
    z.rmax0=y.rmax0;
    if(y.sum0==y.len)
        z.rmax0=y.len+x.rmax0;
    z.rmax1=y.rmax1;
    if(y.sum1==y.len)
        z.rmax1=y.len+x.rmax1;
    z.maxx0=max({x.maxx0,y.maxx0,x.rmax0+y.lmax0});
    z.maxx1=max({x.maxx1,y.maxx1,x.rmax1+y.lmax1});
    z.tag1=z.tag2=z.tag3=0;
    return z;
}
void pre(int k,int l,int r){
    tree[k].len=r-l+1;
    if(l==r){
        add(k,l,r,a[l]);
        return ;
    }
    int mid=(l+r)>>1;
    pre(ls);
    pre(rs);
    tree[k]=pushup(tree[k<<1],tree[k<<1|1]);
}
void change1(int k,int l,int r,int x,int y,int d){
    if(x<=l&&r<=y){
        add(k,l,r,d);
        return ;
    }
    int mid=(l+r)>>1;
    pushdown(k,l,r);
    if(x<=mid)
        change1(ls,x,y,d);
    if(mid<y)
        change1(rs,x,y,d);
    tree[k]=pushup(tree[k<<1],tree[k<<1|1]);
}
node query(int k,int l,int r,int x,int y){
    if(x<=l&&r<=y)
        return tree[k];
    int mid=(l+r)>>1;
    pushdown(k,l,r);
    if(x<=mid&&mid<y)
        return pushup(query(ls,x,y),query(rs,x,y));
    if(x<=mid)
        return query(ls,x,y);
    if(mid<y)
        return query(rs,x,y);
}
int main(){
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    pre(1,1,n);
    int op,x,y;
    while(q--){
        scanf("%d%d%d",&op,&x,&y);
        x++,y++;
        if(op<3)
            change1(1,1,n,x,y,op);
        else
            if(op==3)
                printf("%d\n",query(1,1,n,x,y).sum1);
            else
                if(op==4) 
                    printf("%d\n",query(1,1,n,x,y).maxx1);
    }
    return 0;
}

附测试数据

10 6
0 0 0 1 1 0 1 0 1 1
1 3 8
0 6 7
2 1 10
3 1 8
3 1 8
4 1 7

by yizhiming @ 2023-02-17 19:15:43

@wukaichen888 srds哥们你这数据是不是有误,原题下标从0开始,你这范围应该是0-9吧,咋有个

2 1 10


by wukaichen888 @ 2023-02-17 21:13:30

抱歉我是傻逼 qwq


|