下面这个代码是会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倍空间吗?