关于线段树内存
查看原帖
关于线段树内存
291915
Eddy2008楼主2021/8/19 21:27

下面这个代码是会RE的

#include<bits/stdc++.h>
#define maxn 50010
#define lson 2*rt,l,mid
#define rson 2*rt+1,mid+1,r
using namespace std;
int n,m;
struct node{
    int len,lazy;
    int imax,lmax,rmax;
}T[4*maxn];
void build(int rt,int l,int r){
    T[rt].len=r-l+1;T[rt].lazy=0;
    T[rt].imax=T[rt].lmax=T[rt].rmax=T[rt].len;
    if(l==r) return;
    int mid=(l+r)>>1;
    build(lson);build(rson);
}
void update(int rt){
    //左区间
    if(T[2*rt].len==T[2*rt].imax){
        T[rt].lmax=T[2*rt].imax+T[2*rt+1].lmax;
    }
    else{
        T[rt].lmax=T[2*rt].lmax;
    }
    //右区间
    if(T[2*rt+1].len==T[2*rt+1].imax){
        T[rt].rmax=T[2*rt+1].imax+T[2*rt].rmax;
    }
    else{
        T[rt].rmax=T[2*rt+1].rmax;
    }
    //总区间
    T[rt].imax=max(T[2*rt].imax,T[2*rt+1].imax);
    T[rt].imax=max(T[rt].imax,T[2*rt].rmax+T[2*rt+1].lmax);
    return;
}
void down(int rt){
    if(!T[rt].lazy) return;
    T[2*rt].lazy=T[2*rt+1].lazy=T[rt].lazy;
    if(T[rt].lazy==1){
        T[2*rt].lmax=T[2*rt].rmax=T[2*rt].imax=0;
        T[2*rt+1].lmax=T[2*rt+1].rmax=T[2*rt+1].imax=0;
    }
    if(T[rt].lazy==2){
        T[2*rt].lmax=T[2*rt].rmax=T[2*rt].imax=T[2*rt].len;
        T[2*rt+1].lmax=T[2*rt+1].rmax=T[2*rt+1].imax=T[2*rt+1].len;
    }
    T[rt].lazy=0;
    return;
}
int find(int rt,int l,int r,int x){
    down(rt);
    if(l==r) return l;
    int mid=(l+r)>>1;
    if(T[2*rt].imax>=x){
        return find(lson,x);
    }
    else if(T[2*rt].rmax+T[2*rt+1].lmax>=x){
        return mid-T[2*rt].rmax+1;
    }
    else if(T[2*rt+1].imax>=x){
        return find(rson,x);
    }
}
void add(int rt,int l,int r,int x,int y){
    down(rt);
    if(x<=l &&r<=y){
        T[rt].imax=T[rt].lmax=T[rt].rmax=0;
        T[rt].lazy=1;
        return;
    }
    int mid=(l+r)>>1;
    if(x<=mid) add(lson,x,y);
    if(mid<y)  add(rson,x,y);
    update(rt);
}
void del(int rt,int l,int r,int x,int y){
    down(rt);
    if(x<=l &&r<=y){
        T[rt].imax=T[rt].lmax=T[rt].rmax=T[rt].len;
        T[rt].lazy=2;
        return;
    }
    int mid=(l+r)>>1;
    if(x<=mid) del(lson,x,y);
    if(mid<y)  del(rson,x,y);
    update(rt);
}
int main(){
    scanf("%d%d",&n,&m);
    build(1,1,n);
    for(int i=1,op,x,y,ans;i<=m;i++){
        scanf("%d",&op);
        if(op==1){
			scanf("%d",&x);
            ans=0;
            if(T[1].imax>=x){
                ans=find(1,1,n,x);
                add(1,1,n,ans,ans+x-1);
            }
            printf("%d\n",ans);
        }
        else{
            scanf("%d%d",&x,&y);
            del(1,1,n,x,x+y-1);
        }
    }
    return 0;
}

可我将

T[4*maxn];

改为

T[8*maxn];

就通过了

请问各位这是为何?不应该只用开4倍空间吗?

2021/8/19 21:27
加载中...