25分玄关求调orz 感觉是update出错但不知错哪
查看原帖
25分玄关求调orz 感觉是update出错但不知错哪
984202
Qinkaixi666楼主2024/10/21 21:42
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#define int long long
using namespace std;
const int N=200009;
int mn(int a,int b){return a<b?a:b;}
int mx(int a,int b){return a>b?a:b;}
int n,m,lim;
int sum[N<<2],tag[N<<2],sumz[N<<2],sumy[N<<2],sumzd[N<<2];
struct node{int mxz;int mxy;int mxx;};
inline int read()
{
    int s=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){s=s*10+c-'0';c=getchar();}
    return f*s;
}
void pushup(int t,int l,int r){
    sum[t]=sum[t*2]+sum[t*2+1];
    int mid=(l+r)>>1;
    sumz[t]=sumz[t*2];
    if(sumzd[t*2]==l-mid+1) sumz[t]=mx(sumz[t],sumzd[t*2]+sumz[t*2+1]);

    sumy[t]=sumy[t*2+1];
    if(sumzd[t*2+1]==r-mid) sumy[t]=mx(sumy[t],sumzd[t*2+1]+sumy[t*2]);
    sumzd[t]=mx(mx(sumzd[t*2],sumzd[t*2+1]),sumy[t*2]+sumz[t*2+1]);
    
}
void build(int t,int tl,int tr){
    if(tl==tr) {sum[t]=1;sumz[t]=sumy[t]=sumzd[t]=0;return ;}
    int mid=(tl+tr)>>1;
    build(t*2,tl,mid);build(t*2+1,mid+1,tr);
    pushup(t,tl,tr);
}
void pushdown(int t,int tl,int tr){
    if(tag[t]==0) return ;
    if(tag[t]==-1) tag[t]=0;
    int mid=(tl+tr)>>1;
    sum[t*2]=(mid-tl+1)*tag[t];
    sumz[t*2]=sumy[t*2]=sumzd[t*2]=(tag[t])?0:(mid-tl+1);

    sum[t*2+1]=(tr-mid)*tag[t];
    sumz[t*2+1]=sumy[t*2+1]=sumzd[t*2+1]=(tag[t])?0:(tr-mid);
    tag[t*2]=(tag[t]==0)?-1:tag[t];tag[t*2+1]=(tag[t]==0)?-1:tag[t];
    tag[t]=0;
}
void update(int t,int tl,int tr,int l,int r,int z){
    if(lim<=0) return ;
    if(l<=tl&&tr<=r&&tr-tl+1-sum[t]<=lim){
        lim-=(tr-tl+1-sum[t]);
        sum[t]=(tr-tl+1)*z;tag[t]=(z==0)?-1:z;
        sumz[t]=sumy[t]=sumzd[t]=(z)?0:tr-tl+1;
        return ;
    }
    pushdown(t,tl,tr);
    int mid=(tl+tr)>>1;
    if(l<=mid)update(t*2,tl,mid,l,r,z);
    if(r>mid) update(t*2+1,mid+1,tr,l,r,z);
    pushup(t,tl,tr);
}
node query(int t,int tl,int tr,int l,int r)
{
    if(l<=tl&&tr<=r) {return (node){sumz[t],sumy[t],sumzd[t]};}
    pushdown(t,tl,tr);
    int mid=(tl+tr)>>1,f1=0,f2=0;
    node L,R;
    if(l<=mid) {f1=1,L=query(t*2,tl,mid,l,r);}
    if(r>mid) {f2=1;R=query(t*2+1,mid+1,tr,l,r);}
    if(f1==0&&f2==1)return R;
    if(f1==1&&f2==0)return L;
    node tmp;
    tmp.mxz=L.mxz;if(L.mxx==l-mid+1) tmp.mxz=mx(tmp.mxz,L.mxx+R.mxz);
    tmp.mxy=R.mxy;if(R.mxx==r-mid) tmp.mxy=mx(tmp.mxy,R.mxx+L.mxy);
    tmp.mxx=(mx(L.mxx,R.mxx),L.mxy+R.mxz);
    
    return tmp;
}
int querysum(int t,int tl,int tr,int l,int r)
{
    if(l<=tl&&tr<=r) {return sum[t];}
    pushdown(t,tl,tr);
    int ans=0,mid=(tl+tr)>>1;
    if(l<=mid) ans+=querysum(t*2,tl,mid,l,r);
    if(r>mid) ans+=querysum(t*2+1,mid+1,tr,l,r);
    return ans;
}
signed main()
{
    n=read();m=read();build(1,1,n);
    for(int ty,l1,r1,l2,r2,i=1;i<=m;i++)
    {
        ty=read();
        if(ty==0) l1=read(),r1=read(),lim=N,update(1,1,n,l1,r1,0);
        if(ty==1)
        {
            l1=read(),r1=read(),l2=read(),r2=read();
            int tt=querysum(1,1,n,l1,r1);
            lim=N;update(1,1,n,l1,r1,0);
            lim=tt;update(1,1,n,l2,r2,1);
        }
        if(ty==2) l1=read(),r1=read(),printf("%lld\n",query(1,1,n,l1,r1).mxx);
    }
    /*for(int i=1;i<=10;i++)cout<<query(1,1,n,i,i).mxx<<" ";
    cout<<endl<<query(1,1,n,5,10).mxx<<endl;
    cout<<endl<<query(1,1,n,5,8).mxx;*/
    return 0;
}




2024/10/21 21:42
加载中...