线段树-92分RE/MLE求助
查看原帖
线段树-92分RE/MLE求助
369248
wuhongzhen楼主2022/11/13 11:22
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct TreeNode{
	int l,r,sum,m1,m2;//m1=max,m2=min;
	void clear(){
		l=r=sum=0;
		m1=-1e9,m2=1e9;
	}
} tree[maxn*15];//这个地方正常来说maxn*15就可以了,但是*19会RE,*20会MLE
stack<int> stk;
int tot=1,n;
void pushup(int p){
	int ls=tree[p].l;
	int rs=tree[p].r;
	if(ls&&rs){
		tree[p].sum=tree[ls].sum+tree[rs].sum;
		tree[p].m1=tree[rs].m1;	
		tree[p].m2=tree[ls].m2;
	}
	else if(ls){
		tree[p].sum=tree[ls].sum;
		tree[p].m1=tree[ls].m1;	
		tree[p].m2=tree[ls].m2;
	}else if(rs){
		tree[p].sum=tree[rs].sum;
		tree[p].m1=tree[rs].m1;	
		tree[p].m2=tree[rs].m2;
	} else{
		tree[p].sum=0;
		tree[p].m1=-1e9;	
		tree[p].m2=1e9;
	}
	return;
}
int insert(int p,int l,int r,int x,int v){
	if(p==0){
		if(!stk.empty()){
			p=stk.top();
			stk.pop();
			tree[p].clear();
		} else{
		p=++tot;
		tree[p].clear();	
		}
		
	}
	if(l==r){
		tree[p].sum+=v;
		if(tree[p].sum==0){
			stk.push(p);
			p=0;
		}else{
			tree[p].m1=tree[p].m2=x;
		}
		return p;
	}
	int mid=(l+r)/2;
	if(x<=mid)
	tree[p].l=insert(tree[p].l,l,mid,x,v);
	else
	tree[p].r=insert(tree[p].r,mid+1,r,x,v);
	pushup(p);
	if(p!=1&&tree[p].sum==0){
		stk.push(p);
		p=0;
	}
	return p;
}
int Rank(int p,int l,int r,int x){
	if(l>=x||p==0) return 0;
	if(r<x) return tree[p].sum;
	int mid=(l+r)/2;
	int ls=tree[p].l,rs=tree[p].r;
	return Rank(ls,l,mid,x)+Rank(rs,mid+1,r,x);
}
int query(int p,int l,int r,int x){
	if(p==0||tree[p].sum<x) return -1;
	if(l==r) return l;
	int ls=tree[p].l,rs=tree[p].r;
	int mid=(l+r)/2;
	if(ls&&tree[ls].sum>=x)
	return query(ls,l,mid,x);
	return query(rs,mid+1,r,x-tree[ls].sum);
}
int main(){
	tree[1].clear();
	cin>>n;
	for(int i=1;i<=n;i++){
		int op;
		cin>>op;
		if(op==1){
			int x;
			cin>>x;
			insert(1,-1e7,1e7,x,1);
		}
		else
		if(op==2){
			int x;
			cin>>x;
			insert(1,-1e7,1e7,x,-1);
		}
		else
		if(op==3){
			int x;
			cin>>x;
			cout<<Rank(1,-1e7,1e7,x)+1<<endl;
		}
		else
		if(op==4){
			int x;
			cin>>x;
			cout<<query(1,-1e7,1e7,x)<<endl;
		}
		else
		if(op==5){
			int x;
			cin>>x;
			cout<<query(1,-1e7,1e7,Rank(1,-1e7,1e7,x))<<endl;
		}
		else
		{
			int x;
			cin>>x;
			cout<<query(1,-1e7,1e7,Rank(1,-1e7,1e7,x+1)+1)<<endl;
			
		}
	}
	return 0;
}
2022/11/13 11:22
加载中...