求助:新学Treap,TLE了最后一个点
查看原帖
求助:新学Treap,TLE了最后一个点
457181
Invulnerable楼主2021/9/5 15:53

求助

#include<bits/stdc++.h>
using namespace std;
const int N=1000005,INF=0x3f3f3f3f;
int n,size[N],l[N],r[N],ct[N],v[N],rnd[N],sz,ss;
int rand(){
	int seed=12345;
	return seed=(int)seed*482711LL%2147483647;
}
void update(int p){
	size[p]=size[l[p]]+size[r[p]]+ct[p];
	return;
}
void rturn(int &k){
	int t=l[k];
	l[k]=r[t];
	r[t]=k;
	size[t]=size[k];
	update(k);
	k=t;
	return;
}
void lturn(int &k){
	int t=r[k];
	r[k]=l[t];
	l[t]=k;
	size[t]=size[k];
	update(k);
	k=t;
	return;
}
void ins(int &p,int x){
	if(p==0){
		p=++sz;
		size[p]=1;
		ct[p]=1;
		v[p]=x;
		rnd[p]=rand();
		return;
	}
	size[p]++;
	if(v[p]==x)
		ct[p]++;
	else if(x>v[p]){
		ins(r[p],x);
		if(rnd[r[p]]<rnd[p])
			lturn(p);
	}
	else{
		ins(l[p],x);
		if(rnd[l[p]]<rnd[p])
			rturn(p);
	}
	return;
}
void del(int &p,int x){
	if(p==0)
		return;
	if(v[p]==x)
		if(ct[p]>1){
			ct[p]--;
			size[p]--;
		}
		else{
			if(l[p]==0||r[p]==0)
				p=l[p]+r[p];
			else if(rnd[l[p]]<rnd[r[p]]){
				rturn(p);
				del(p,x);
			}
			else{
				lturn(p);
				del(p,x);
			}
		}
	else if(x>v[p]){
		size[p]--;
		del(r[p],x);
	}
	else{
		size[p]--;
		del(l[p],x);
	}
	return;
}
int query1(int p,int x){
	if(p==0)
		return 0;
	if(v[p]==x)
		return size[l[p]]+1;
	else if(x>v[p])
		return size[l[p]]+ct[p]+query1(r[p],x);
	else
		return query1(l[p],x);
}
int query2(int p,int x){
	if(p==0)
		return 0;
	if(x<=size[l[p]])
		return query2(l[p],x);
	x-=size[l[p]];
	if(x<=ct[p])
		return v[p];
	x-=ct[p];
	return query2(r[p],x);
}
int findfront(int p,int x){
	if(p==0)
		return -INF;
	if(v[p]<x)
		return max(v[p],findfront(r[p],x));
	return findfront(l[p],x);
}
int findback(int p,int x){
	if(p==0)
		return INF;
	if(v[p]<=x)
		return findback(r[p],x);
	return min(v[p],findback(l[p],x));
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		int flag,x;
		scanf("%d%d",&flag,&x);
		if(flag==1)
			ins(ss,x);
		if(flag==2)
			del(ss,x);
		if(flag==3)
			printf("%d\n",query1(ss,x));
		if(flag==4)
			printf("%d\n",query2(ss,x));
		if(flag==5)
			printf("%d\n",findfront(ss,x));
		if(flag==6)
			printf("%d\n",findback(ss,x));
	}
	return 0;
}
2021/9/5 15:53
加载中...