样例和hack数据过了,求调

P2572 [SCOI2010] 序列操作

xxxaIq @ 2024-12-05 20:57:58

题目的样例和 这里的所有hack 以及数据中的 hack 都过了,但是 WA 0pts求调。

//code by xxxalq
#include<bits/stdc++.h>
#define ll long long
#define mid ((t[p].l+t[p].r)/2)
using namespace std;

const int maxn=100003;

int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch>57||ch<48){
        if(ch==45){
            f=-1;
        }
        ch=getchar();
    }
    while(ch>=48&&ch<=57){
        x=(x<<1)+(x<<3)+(ch-48);
        ch=getchar();
    }
    return x*f;
}

struct node{
    int l,r,v[2],sum,lv[2],rv[2],mk,qf;
}t[maxn<<2];

void pushup(int p){
    t[p].sum=t[p<<1].sum+t[p<<1|1].sum;
    for(int i=0;i<2;i++){
        t[p].v[i]=max(max(t[p<<1].v[i],t[p<<1|1].v[i]),t[p<<1].rv[i]+t[p<<1|1].lv[i]);
        t[p].lv[i]=t[p<<1].lv[i];
        if(t[p<<1].lv[i]==mid-t[p].l+1){
            t[p].lv[i]+=t[p<<1|1].lv[i];
        }
        t[p].rv[i]=t[p<<1|1].rv[i];
        if(t[p<<1|1].rv[i]==t[p].r-mid){
            t[p].rv[i]+=t[p<<1].rv[i];
        }
    }
    return;
}

void pushdown(int p){
    if(t[p].mk){
        t[p].mk=0;
        t[p<<1].v[1]=t[p<<1].lv[1]=t[p<<1].rv[1]=0;
        t[p<<1|1].v[1]=t[p<<1|1].lv[1]=t[p<<1|1].rv[1]=0;
        t[p<<1].sum=t[p<<1|1].sum=0;
        t[p<<1].v[0]=t[p<<1].lv[0]=t[p<<1].rv[0]=mid-t[p].l+1;
        t[p<<1|1].v[0]=t[p<<1|1].lv[0]=t[p<<1|1].rv[0]=t[p].r-mid;
        t[p<<1].mk=t[p<<1|1].mk=1;
        t[p<<1].qf=t[p<<1|1].qf=0;
    }
    if(t[p].qf){
        t[p].qf=0;
        t[p<<1].sum=mid-t[p].l+1-t[p<<1].sum;
        swap(t[p<<1].lv[0],t[p<<1].lv[1]);
        swap(t[p<<1].rv[0],t[p<<1].rv[1]);
        swap(t[p<<1].v[0],t[p<<1].v[1]);
        t[p<<1|1].sum=t[p].r-mid-t[p<<1|1].sum;
        swap(t[p<<1|1].lv[0],t[p<<1|1].lv[1]);
        swap(t[p<<1|1].rv[0],t[p<<1|1].rv[1]);
        swap(t[p<<1|1].v[0],t[p<<1|1].v[1]);
        t[p<<1].qf^=1;
        t[p<<1|1].qf^=1;
    }
    return;
}

void update(int p,int l,int r){
    if(l<=t[p].l&&t[p].r<=r){
        t[p].sum=0;
        t[p].v[1]=t[p].lv[1]=t[p].rv[1]=0;
        int len=t[p].r-t[p].l+1;
        t[p].v[0]=t[p].lv[0]=t[p].rv[0]=len;
        t[p].qf=0;
        t[p].mk=1;
        return;
    }
    pushdown(p);
    if(l<=mid){
        update(p<<1,l,r);
    }
    if(r>mid){
        update(p<<1|1,l,r);
    }
    pushup(p);
    return;
}

void qufan(int p,int l,int r){
    if(l<=t[p].l&&t[p].r<=r){
        t[p].sum=t[p].r-t[p].l+1-t[p].sum;
        swap(t[p].lv[0],t[p].lv[1]);
        swap(t[p].rv[0],t[p].rv[1]);
        swap(t[p].v[0],t[p].v[0]);
        t[p].qf^=1;
        return;
    }
    pushdown(p);
    if(l<=mid){
        qufan(p<<1,l,r);
    }
    if(r>mid){
        qufan(p<<1|1,l,r);
    }
    pushup(p);
    return;
}

node query(int p,int l,int r){
    if(l<=t[p].l&&t[p].r<=r){
        return t[p];
    }
    pushdown(p);
    if(l>mid){
        return query(p<<1|1,l,r);
    }
    if(r<=mid){
        return query(p<<1,l,r);
    }
    node res,resl=query(p<<1,l,r),resr=query(p<<1|1,l,r);
    res.sum=resl.sum+resr.sum;
    for(int i=0;i<2;i++){
        res.v[i]=max(max(resl.v[i],resr.v[i]),resl.rv[i]+resr.lv[i]);
        res.lv[i]=resl.lv[i];
        if(resl.lv[i]==min(mid-t[p].l+1,mid-l+1)){
            res.lv[i]+=resr.lv[i];
        }
        res.rv[i]=resr.rv[i];
        if(resr.rv[i]==min(r-mid,t[p].r-mid)){
            res.rv[i]+=resl.rv[i];
        }
    }
    return res;
}

int n,m,a[maxn];

void build(int p,int l,int r){
    t[p].l=l,t[p].r=r;
    if(l==r){
        t[p].sum=a[l];
        for(int i=0;i<2;i++){
            t[p].v[i]=t[p].lv[i]=t[p].rv[i]=(a[l]==i);
        }
        return;
    }
    build(p<<1,l,mid);
    build(p<<1|1,mid+1,r);
    pushup(p);
//  cout<<p<<' '<<l<<" "<<r<<"\n";
//  for(int i=0;i<2;i++){
//      cout<<t[p].v[i]<<" "<<t[p].lv[i]<<" "<<t[p].rv[i]<<"\n";
//  }
//  cout<<"\n";
    return;
}

int main(){
    n=read(),m=read();
    for(int i=1;i<=n;i++){
        a[i]=read();
    }
    build(1,1,n);
    while(m--){
        int op=read(),l=read()+1,r=read()+1;
        if(op==0){
            update(1,l,r);
        }else if(op==1){
            update(1,l,r);
            qufan(1,l,r);
        }else if(op==2){
            qufan(1,l,r);
        }else if(op==3){
            cout<<query(1,l,r).sum<<"\n";
        }else{
            cout<<query(1,l,r).v[1]<<"\n";
        }
//      for(int i=1;i<=n;i++){
//          cout<<query(1,i,i).sum<<" ";
//      }
//      cout<<"\n";
    }
    return 0;
}

|