蒟蒻蒻死了,巨佬来救蒟蒻

P2572 [SCOI2010] 序列操作

George1123 @ 2020-01-23 15:41:29

/******************
    . .
  /\OwO/\
 /  ' '  \

Konny Wendigo
******************/
#include <bits/stdc++.h>
using namespace std;
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define of(i,b,a) for(int i=b;i>=a;i--)
// const int L=1<<16;
// char buf[L],*S,*T;
// inline char Gc(){
//  if(S==T){T=(S=buf)+fread(buf,1,L,stdin);
//      if(S==T) return EOF;}
//  return *S++;
// }
// inline int d(){
//  char c;int f=1,x;
//  for(c=Gc();c>'9'||c<'0';c=Gc())
//      if(c=='-') f=-1;
//  for(x=0;c>='0'&&c<='9';c=Gc())
//      x=(x<<1)+(x<<3)+c-'0';
//  return x*f;
// }
int d(){int x;scanf("%d",&x);return x;}
const int N=1e5+10;
int n,m,a[N];
class ones{public:int sum,lf,rt,v;};
class sumtree{
private:
    int sum[2][N<<2],lf[2][N<<2],rt[2][N<<2],v[2][N<<2],mk[2][N<<2],fl[N<<2];
    void pushup(int k,int l,int r){
        int mid=(l+r)>>1;
        fo(b,0,1){
            sum[b][k]=sum[b][k<<1]+sum[b][k<<1|1];
            if(sum[b][k<<1]<mid-l+1)
                lf[b][k]=lf[b][k<<1];
            else lf[b][k]=sum[b][k<<1]+lf[b][k<<1|1];
            if(sum[b][k<<1|1]<r-mid)
                rt[b][k]=rt[b][k<<1|1];
            else rt[b][k]=sum[b][k<<1|1]+rt[b][k<<1];
            v[b][k]=max(max(v[b][k<<1],v[b][k<<1|1]),rt[b][k<<1]+lf[b][k<<1|1]);
        }
    }
    void pushdown(int k,int l,int r){
        int mid=(l+r)>>1;
        fo(b,0,1) if(mk[b][k]){
            sum[b][k<<1]=lf[b][k<<1]=rt[b][k<<1]=v[b][k<<1]=(mid-l+1);
            sum[b][k<<1|1]=lf[b][k<<1|1]=rt[b][k<<1|1]=v[b][k<<1|1]=(r-mid);
            mk[b][k<<1]=mk[b][k<<1|1]=mk[b][k],mk[b][k]=0;
        }
        if(fl[k]){
            swap(sum[0][k<<1],sum[1][k<<1]);
            swap(lf[0][k<<1],lf[1][k<<1]);
            swap(rt[0][k<<1],rt[1][k<<1]);
            swap(v[0][k<<1],v[1][k<<1]);
            swap(sum[0][k<<1|1],sum[1][k<<1|1]);
            swap(lf[0][k<<1|1],lf[1][k<<1|1]);
            swap(rt[0][k<<1|1],rt[1][k<<1|1]);
            swap(v[0][k<<1|1],v[1][k<<1|1]);
            fl[k<<1]=fl[k<<1|1]=fl[k],fl[k]=0;
        }
    }
public:
    // void check(){printf("%d\n",v[1][1]);}
    void build(int k=1,int l=1,int r=n){
        if(l==r){
            fo(b,0,1) sum[b][k]=lf[b][k]=rt[b][k]=v[b][k]=(a[l]==b);
            return;
        }
        int mid=(l+r)>>1;
        build(k<<1,l,mid),build(k<<1|1,mid+1,r);
        pushup(k,l,r);
    }
    void fix(int x,int y,bool z,int k=1,int l=1,int r=n){
        if(x<=l&&r<=y){
            sum[!z][k]=lf[!z][k]=rt[!z][k]=v[!z][k]=0;
            sum[z][k]=lf[z][k]=rt[z][k]=v[z][k]=r-l+1;
            mk[z][k]=1; return;
        }
        pushdown(k,l,r);
        int mid=(l+r)>>1;
        if(mid>=x) fix(x,y,z,k<<1,l,mid);
        if(mid<y) fix(x,y,z,k<<1|1,mid+1,r);
        pushup(k,l,r);
    }
    void flip(int x,int y,int k=1,int l=1,int r=n){
        if(x<=l&&r<=y){
            swap(sum[0][k],sum[1][k]);
            swap(lf[0][k],lf[1][k]);
            swap(rt[0][k],rt[1][k]);
            swap(v[0][k],v[1][k]);
            fl[k]=1; return;
        }
        pushdown(k,l,r);
        int mid=(l+r)>>1;
        if(mid>=x) flip(x,y,k<<1,l,mid);
        if(mid<y) flip(x,y,k<<1|1,mid+1,r);
        pushup(k,l,r);
    }
    int fsum(int x,int y,int k=1,int l=1,int r=n){
        if(x<=l&&r<=y) return sum[1][k];
        pushdown(k,l,r);
        int mid=(l+r)>>1,V=0;
        if(mid>=x) V+=fsum(x,y,k<<1,l,mid);
        if(mid<y) V+=fsum(x,y,k<<1|1,mid+1,r);
        return V;
    }
    ones fun(int x,int y,int k=1,int l=1,int r=n){
        if(x<=l&&r<=y) return ones{sum[1][k],lf[1][k],rt[1][k],v[1][k]};
        pushdown(k,l,r);
        int mid=(l+r)>>1;
        if(mid>=y) return fun(x,y,k<<1,l,mid);
        if(mid<x) return fun(x,y,k<<1|1,mid+1,r);
        ones L=fun(x,y,k<<1,l,mid),R=fun(x,y,k<<1|1,mid+1,r),V;
        V=(ones){L.sum+R.sum,(L.sum==mid-l+1)?L.sum+R.lf:L.lf,
        (R.sum==r-mid)?R.sum+L.rt:R.rt,max(max(L.v,R.v),L.rt+R.lf)};
        return V;
    }
}c;
int main(){
    n=d(),m=d(); fo(i,1,n) a[i]=d();
    c.build();
    fo(i,1,m){
        int k=d(),l=d()+1,r=d()+1;
        if(k==0) c.fix(l,r,0);
        else if(k==1) c.fix(l,r,1);
        else if(k==2) c.flip(l,r);
        else if(k==3) printf("%d\n",c.fsum(l,r));
        else printf("%d\n",c.fun(l,r).v);
        // fo(j,1,n) printf("%d%c",c.fsum(j,j)," \n"[j==n]);
    }
    return 0;
}

代码很短,但蒟蒻调不出来。

求助路佬甲,帮我看看吧!


by hly1204 @ 2020-01-23 15:43:33

看了下我写了137行。。这东西估计没人愿意调吧


by George1123 @ 2020-01-23 15:44:06

@hly1204 %%%


by George1123 @ 2020-01-23 15:44:17

是AK巨佬!


by George1123 @ 2020-01-23 15:44:24

蒟蒻有救啦!


by George1123 @ 2020-01-23 15:45:21

是flip函数的问题


by George1123 @ 2020-01-23 15:51:49

巨佬来啊!


by George1123 @ 2020-01-23 15:52:01

蒟蒻溺死了


by RainsAFO @ 2020-01-23 16:05:05

建议重构


by George1123 @ 2020-01-23 16:10:41

@Lab_Tree 可惜巨佬只会欺负蒟蒻


by BabyBenzene @ 2020-01-23 16:12:06

妈妈说看到@♗Wendigo♝这种大佬只需要

stO stO @♗Wendigo♝ Orz Orz

就行啦


| 下一页