QAQ 0分求助

P2572 [SCOI2010] 序列操作

我能自己爬了 @ 2022-02-09 22:51:40

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll rd(){
   ll w=0,f=1;char ch=getchar();
   while(ch<'0'||ch>'9')f=(ch=='-')?-1:1,ch=getchar();
   while(ch>='0'&&ch<='9')w=(w<<1)+(w<<3)+(ch^48),ch=getchar();
   return w*f;
}
const int lm=100001;
ll n,m,a[lm],b[lm];
struct node{
    ll id,r;
}wyz[lm<<2];
ll ls(ll p){
    return p<<1;
}
ll rs(ll p){
    return p<<1|1;
}
ll ans[lm<<2],tag[lm<<2],tag3[lm<<2],tag2[lm<<2],ans3[lm<<2],ans4[lm<<2],ans2[lm<<2],ans5[lm<<2],ans6[lm<<2],ans7[lm<<2];
//ans--总共有多少1 1--全0 2--全1  3--取反   ans3---左边最长  ans4---右边最长  ans2---最多连续的1   ans5--左边   ans6---右边  ans7--最多连续   
void push_up(ll p,ll l,ll r){
    ll mid=(l+r)>>1;
    ans[p]=ans[ls(p)]+ans[rs(p)];
    ans2[p]=max(ans2[rs(p)],max(ans2[ls(p)],ans3[rs(p)]+ans4[ls(p)]));
    ans3[p]=ans3[ls(p)]+(ans3[rs(p)]*(ans7[ls(p)]==0));
    ans4[p]=ans4[rs(p)]+(ans4[ls(p)]*(0==ans7[rs(p)]));
    ans2[p]=max(ans2[p],max(ans3[p],ans4[p]));
    ans5[p]=ans5[ls(p)]+(ans5[rs(p)]*(0==ans[ls(p)]));
    ans6[p]=ans6[rs(p)]+(ans6[ls(p)]*(0==ans[rs(p)]));
    ans7[p]=max(ans7[ls(p)],max(ans7[rs(p)],ans5[rs(p)]+ans6[ls(p)]));
    ans7[p]=max(ans5[p],max(ans6[p],ans7[p]));
}
void build(ll p,ll l,ll r){
    wyz[p].r=r;
    wyz[p].id=p;
    tag[p]=0;
    if(l==r){
        ans[p]=ans2[p]=ans3[p]=ans4[p]=a[l];
        ans5[p]=ans6[p]=ans7[p]=!a[l]; 
        return ;
    }
    ll mid=(l+r)>>1;
    build(ls(p),l,mid);
    build(rs(p),mid+1,r);
    push_up(p,l,r);
}
void f(ll p,ll l,ll r,ll k,ll k2,ll k3){
     if(k==1){
        tag[p]=1;
        tag2[p]=0;
        tag3[p]=0;
        ans2[p]=ans3[p]=ans4[p]=ans[p]=(r-l+1);
        ans5[p]=ans6[p]=ans7[p]=0;
     }
     else if(k2==1){
        tag[p]=0;
        tag2[p]=1;
        tag3[p]=0;
        ans2[p]=ans3[p]=ans4[p]=ans[p]=0;
        ans5[p]=ans6[p]=ans7[p]=(r-l+1);
     }
    else if(k3==1){
        if(tag[p]>0){
            tag[p]=0;
            tag2[p]=1;
            tag3[p]=0;
            ans2[p]=ans3[p]=ans4[p]=ans[p]=0;
            ans5[p]=ans6[p]=ans7[p]=(r-l+1);
            return ;
        }
        else if(tag2[p]>0){
            tag[p]=1;
            tag2[p]=0;
            tag3[p]=0;
            ans2[p]=ans3[p]=ans4[p]=ans[p]=(r-l+1);
            ans5[p]=ans6[p]=ans7[p]=0;
            return ;
        }
        tag[p]=0;
        tag2[p]=0;
        tag3[p]++;
        tag3[p]%=2;
        ans[p]=(r-l+1)-ans[p];
        swap(ans2[p],ans7[p]);
        swap(ans3[p],ans5[p]);
        swap(ans4[p],ans6[p]);
    }
}
void push_down(ll p,ll l,ll r){
    ll mid=(l+r)>>1;
    f(ls(p),l,mid,tag[p],tag2[p],tag3[p]);
    f(rs(p),mid+1,r,tag[p],tag2[p],tag3[p]);
    tag[p]=tag2[p]=tag3[p]=0;
} 
void update(ll p,ll l,ll r,ll ul,ll ur,ll k){
    if(l==ul&&r==ur){
        if(k==1){
            tag[p]=1;
            tag2[p]=0;
            tag3[p]=0;
            ans2[p]=ans3[p]=ans4[p]=ans[p]=(r-l+1);
            ans5[p]=ans6[p]=ans7[p]=0;
        }
        else if(k==2){
            tag[p]=0;
            tag2[p]=1;
            tag3[p]=0;
            ans2[p]=ans3[p]=ans4[p]=ans[p]=0;
            ans5[p]=ans6[p]=ans7[p]=(r-l+1);
        }
        else {
            if(tag[p]>0){
                tag[p]=0;
                tag2[p]=1;
                tag3[p]=0;
                ans2[p]=ans3[p]=ans4[p]=ans[p]=0;
                ans5[p]=ans6[p]=ans7[p]=(r-l+1);
                return ;
            }
            else if(tag2[p]>0){
                tag[p]=1;
                tag2[p]=0;
                tag3[p]=0;
                ans2[p]=ans3[p]=ans4[p]=ans[p]=(r-l+1);
                ans5[p]=ans6[p]=ans7[p]=0;
                return ;
            }
            tag[p]=0;
            tag2[p]=0;
            tag3[p]+=1;
            tag3[p]%=2;
            ans[p]=(r-l+1)-ans[p];
            swap(ans2[p],ans7[p]);
            swap(ans3[p],ans5[p]);
            swap(ans4[p],ans6[p]);
        }
        return ;
    }
    push_down(p,l,r);
    ll mid=(l+r)>>1;
    if(ul>mid)update(rs(p),mid+1,r,ul,ur,k);
    else if(ur<=mid)update(ls(p),l,mid,ul,ur,k);
    else {update(ls(p),l,mid,ul,mid,k);update(rs(p),mid+1,r,mid+1,ur,k);}
    push_up(p,l,r);
}
ll fd(ll p,ll l,ll r,ll fl,ll fr){
    if(l==fl&&r==fr)return ans[p];
    push_down(p,l,r);
    ll mid=(l+r)>>1;
    if(fl>mid)return fd(rs(p),mid+1,r,fl,fr);
    else if(fr<=mid)return fd(ls(p),l,mid,fl,fr);
    else return fd(ls(p),l,mid,fl,mid)+fd(rs(p),mid+1,r,mid+1,fr); 
}
ll jl[lm>>2],ljl=0;
void fd3(ll p,ll l,ll r,ll fl,ll fr){
    if(l==fl&&r==fr){
        jl[++ljl]=p;
        return ;
    }
    push_down(p,l,r);
    ll mid=(l+r)>>1;
    if(fl>mid)fd3(rs(p),mid+1,r,fl,fr);
    else if(fr<=mid)fd3(ls(p),l,mid,fl,fr);
    else fd3(ls(p),l,mid,fl,mid),fd3(rs(p),mid+1,r,mid+1,fr); 
}
bool cmp(node x,node y){
    return x.r<y.r;
}
ll fd2(ll p,ll l,ll r,ll fl,ll fr){

    //cout<<"HAHA";
    ljl=0;ll sum=0;
    fd3(p,l,r,fl,fr);
    node nb[ljl+1];
    //sort(jl+1,jl+ljl+1);
    for(int i=1;i<=ljl;i++)nb[i].r=wyz[jl[i]].r,nb[i].id=jl[i],sum=max(sum,ans2[jl[i]]);
    sort(nb+1,nb+ljl+1,cmp);
    for(int i=1;i<=ljl;i++){
        //sum=max(sum,ans2[jl[i]]);
        ll sls=ans4[nb[i].id],j=i+1;
        while(j<ljl&&ans7[j]==0)sls+=ans2[nb[i].id],j++;
        if(ljl>1)sls+=ans3[nb[i].id];
        sum=max(sum,sls);
        i=j-1;
    }
    return sum;
} 
int main(){
//  freopen("P1438_2.in","r",stdin);
//  freopen("1.txt","w",stdout);
    n=rd();m=rd();
    for(int i=1;i<=n;i++)a[i]=rd();
    build(1,1,n);
//  for(int i=1;i<=n<<2;i++){
//      cout<<i<<"----"<<ans[i]<<" "<<ans2[i]<<" "<<ans3[i]<<" "<<ans4[i]<<" "<<ans5[i]<<" "<<ans6[i]<<" "<<ans7[i]<<endl;
//  }
    while(m--){
        ll op=rd(),l=rd(),r=rd();
        l++,r++;
        if(op==0){
            update(1,1,n,l,r,2);
        }
        else if(op==1){
            //ll q=rd();
            update(1,1,n,l,r,1);

        }
        else if(op==2)update(1,1,n,l,r,3);
        else if(op==3)printf("%lld\n",fd(1,1,n,l,r));
        else printf("%lld\n",fd2(1,1,n,l,r));
//      for(int i=1;i<=n<<2;i++){
//      cout<<i<<"----"<<ans[i]<<" "<<ans2[i]<<" "<<ans3[i]<<" "<<ans4[i]<<" "<<ans5[i]<<" "<<ans6[i]<<" "<<ans7[i]<<" "<<tag[i]<<" "<<tag2[i]<<" "<<tag3[i]<<endl;
//  }
    }
    return 0;
}

by 我能自己爬了 @ 2022-02-10 19:44:59

找到了 你这个fd3的下标位置错了 改过来的就好了


by 我能自己爬了 @ 2022-02-10 19:45:26

@我能自己爬了 好的谢谢dalao QAQ


by 我能自己爬了 @ 2022-02-10 19:47:28

@我能自己爬了 呜呜呜呜呜终于A了


|