只有hack过了,求调
查看原帖
只有hack过了,求调
535996
Blanc_min楼主2024/3/31 11:23
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m,tt,rt;
struct bb {
    ll l1,l0,num,l,r,q1,q0,h1,h0,bj;//bj=1/2:赋值为0/1;bj=3:翻转
}tree[800005];
struct bl {
    ll q,h,l;
};
void pushup(ll x,ll ls,ll rs) {
    ll l=tree[x].l,r=tree[x].r,mid=(ls+rs)>>1;
    tree[x].num=tree[l].num+tree[r].num;
    tree[x].l0=max(max(tree[l].l0,tree[r].l0),tree[l].h0+tree[r].q0);
    tree[x].l1=max(max(tree[l].l1,tree[r].l1),tree[l].h1+tree[r].q1);
    tree[x].q1=(tree[l].q1+((tree[l].q1==mid-ls+1)?tree[r].q1:0)),tree[x].q0=(tree[l].q0+((tree[l].q0==mid-ls+1)?tree[r].q0:0));
    tree[x].h0=(tree[r].h0+((tree[r].h0==rs-mid)?tree[l].h0:0)),tree[x].h1=(tree[r].h1+((tree[r].h1==rs-mid)?tree[l].h1:0));
}
void pushdown(ll x,ll l,ll r) {
    ll w=tree[x].bj;
    if(!w) return ;
    if(w==1) {
        tree[x].num=0;
        tree[x].h0=tree[x].l0=tree[x].q0=r-l+1;
        tree[x].h1=tree[x].l1=tree[x].q1=0;
    }
    if(w==2) {
        tree[x].num=r-l+1;
        tree[x].h0=tree[x].l0=tree[x].q0=0;
        tree[x].h1=tree[x].l1=tree[x].q1=r-l+1;
    }
    if(w==3) {
        tree[x].num=r-l+1-tree[x].num;
        swap(tree[x].h0,tree[x].h1);
        swap(tree[x].l0,tree[x].l1);
        swap(tree[x].q0,tree[x].q1);
    }
    if(tree[x].bj==1||tree[x].bj==2) tree[tree[x].l].bj=tree[tree[x].r].bj=tree[x].bj;
    else {
        if(tree[tree[x].l].bj==1) tree[tree[x].l].bj=2;
        else if(tree[tree[x].l].bj==2) tree[tree[x].l].bj=1;
        else if(tree[tree[x].l].bj==3) tree[tree[x].l].bj=0;
        else if(tree[tree[x].l].bj==0) tree[tree[x].l].bj=3;
        if(tree[tree[x].r].bj==1) tree[tree[x].r].bj=2;
        else if(tree[tree[x].r].bj==2) tree[tree[x].r].bj=1;
        else if(tree[tree[x].r].bj==3) tree[tree[x].r].bj=0;
        else if(tree[tree[x].r].bj==0) tree[tree[x].r].bj=3;
    }
    tree[x].bj=0;
}
void add(ll &x,ll l,ll r,ll ls,ll rs,ll w) {
    if(!x) x=++tt;
    if(ls<=l&&r<=rs) {
        pushdown(x,l,r);
        tree[x].bj=w;
        pushdown(x,l,r);
        return ;
    }
    ll mid=(l+r)>>1;
    if(mid>=ls) add(tree[x].l,l,mid,ls,rs,w);
    if(mid<rs) add(tree[x].r,mid+1,r,ls,rs,w);
    if(tree[x].l) pushdown(tree[x].l,l,mid);
    if(tree[x].r) pushdown(tree[x].r,mid+1,r);
    pushup(x,l,r);
}
ll find3(ll x,ll l,ll r,ll ls,ll rs) {
    if(!x) return 0; 
    pushdown(x,l,r);
    if(ls<=l&&r<=rs) return tree[x].num;
    ll mid=(l+r)>>1,sum=0;
    if(mid>=ls) sum+=find3(tree[x].l,l,mid,ls,rs);
    if(mid<rs) sum+=find3(tree[x].r,mid+1,r,ls,rs);
    return sum;
}
bl find4(ll x,ll l,ll r,ll ls,ll rs) {
    if(!x) return (bl){0,0,0};
    pushdown(x,l,r);
    if(ls<=l&&r<=rs) return (bl){tree[x].q1,tree[x].h1,tree[x].l1};
    ll mid=(l+r)>>1;
    bl lw={0,0,0},rw={0,0,0};
    if(mid>=ls) lw=find4(tree[x].l,l,mid,ls,rs);
    if(mid<rs) rw=find4(tree[x].r,mid+1,r,ls,rs);
    return {(lw.q+((lw.q==mid-l+1)?rw.q:0)),(rw.h+(rw.h==r-mid?lw.h:0)),max(lw.l,max(rw.l,lw.h+rw.q))};
}
int main() {
    cin>>n>>m;
    for(ll i=1;i<=n;i++) {
        ll x;
        cin>>x;
        add(rt,1,n,i,i,x+1);
    }
    // cout<<find3(rt,1,n,1,n)<<endl;
    for(ll i=1;i<=m;i++) {
        ll l,r,op;
        cin>>op>>l>>r;
        l++,r++;
        if(op==0||op==1||op==2) add(rt,1,n,l,r,op+1);
        else {
            if(op==3) cout<<find3(rt,1,n,l,r)<<endl;
            if(op==4) cout<<find4(rt,1,n,l,r).l<<endl;
        }
        // for(ll i=1;i<=n;i++) cout<<find3(rt,1,n,i,i)<<' ';
        // cout<<endl;
    }
    return 0;
}
/*
0 0 0 1 1 0 1 0 1 1 

1 1 1 1 1 0 1 0 1 1 8
1 1 1 1 1 0 1 0 1 1 8
1 1 0 1 1 0 1 0 1 1 7
1 1 0 1 1 0 1 0 1 1 7
1 1 0 0 0 0 0 0 1 1 
1 1 0 1 1 1 1 1 1 1 
1 1 0 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 0 0 1 1 1
1 1 1 1 1 0 0 1 1 1  
*/
2024/3/31 11:23
加载中...