30分求助,只要当询问是跨mid时,需合并则必错
查看原帖
30分求助,只要当询问是跨mid时,需合并则必错
574890
zfy2006楼主2022/6/27 17:45
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int n,m;
bool g=0;
struct o{
    int sum,mx,lc,rc,tg,l,r;
    //sum为1的个数,mx为最大连续0区间
}t[N<<3];
inline void pushup(int x,int l,int r){
    t[x].sum=t[x<<1].sum+t[x<<1|1].sum;
    t[x].mx=max(t[x<<1].mx,t[x<<1|1].mx);
    t[x].lc=t[x<<1].lc,t[x].rc=t[x<<1|1].rc;
    t[x].mx=max(t[x].mx,t[x<<1].rc+t[x<<1|1].lc);
    int mid=(l+r)>>1;
    if(t[x<<1].lc==mid-l+1)t[x].lc+=t[x<<1|1].lc;
    if(t[x<<1|1].rc==r-mid)t[x].rc+=t[x<<1].rc;
}
inline void tp(int x,int l,int r,int val){
    t[x].sum=val?r-l+1:0;
    t[x].lc=t[x].rc=val?0:r-l+1;
    t[x].mx=val?0:r-l+1;
    t[x].tg=val;
}
inline void pushdown(int x,int l,int r){
    if(t[x].tg!=-1){
        int mid=(l+r)>>1;
        tp(x<<1,l,mid,t[x].tg);
        tp(x<<1|1,mid+1,r,t[x].tg);
        t[x].tg=-1;
    }
    return;
}
inline void build(int x,int l,int r){
    t[x].l=l,t[x].r=r;
    if(l==r){
        t[x].sum=1;
        t[x].lc=t[x].rc=t[x].mx=0;
        t[x].tg=-1;
        return;
    }
    int mid=(l+r)>>1;
    build(x<<1,l,mid);
    build(x<<1|1,mid+1,r);
    pushup(x,l,r);
    t[x].tg=-1;
    return;
}
inline int update(int x,int l,int r,int ql,int qr){
    if(l>qr||r<ql)return 0;
    pushdown(x,l,r);
    if(l>=ql&&r<=qr){
        int k=t[x].sum;
        tp(x,l,r,0);
        return k;
    }
    int mid=(l+r)>>1;
    int sum=update(x<<1,l,mid,ql,qr)+update(x<<1|1,mid+1,r,ql,qr);
    pushup(x,l,r);
    return sum;
}
inline void change(int x,int l,int r,int ql,int qr,int k){
    if(!k||l>qr||r<ql)return;
    pushdown(x,l,r);
    if(l>=ql&&r<=qr&&r-l+1-t[x].sum<=k){
        tp(x,l,r,1);
        return;
    }
    int mid=(l+r)>>1;
    if(mid>=ql){
        int g=k-(mid-l+1-t[x<<1].sum);
        change(x<<1,l,mid,ql,qr,k);
        if(g>0)change(x<<1|1,mid+1,r,ql,qr,g);
    }else change(x<<1|1,mid+1,r,ql,qr,k);
    pushup(x,l,r);
}
inline int ask(int x,int l,int r,int ql,int qr){
    if(l>=ql&&r<=qr)return t[x].mx;
    pushdown(x,l,r);
    int mid=(l+r)>>1;
    if(mid<ql)return ask(x<<1|1,mid+1,r,ql,qr);
    if(mid>=qr)return ask(x<<1,l,mid,ql,qr);
    return max(max(ask(x<<1,l,mid,ql,qr),ask(x<<1|1,mid+1,r,ql,qr)),min(t[x<<1].rc,mid+1-ql)+min(t[x<<1|1].lc,qr-mid));
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n>>m;
    build(1,1,n);
    for(int i=1;i<=m;i++){
        int op,l,r;
        cin>>op>>l>>r;
        if(op==0)update(1,1,n,l,r);
        else if(op==1){
            int k=update(1,1,n,l,r);
            cin>>l>>r;
            change(1,1,n,l,r,k);
        }else{
            cout<<ask(1,1,n,l,r)<<'\n';
        }
    }
    return 0;
}
2022/6/27 17:45
加载中...