可持久化FHQtreap...求调...
查看原帖
可持久化FHQtreap...求调...
497817
羊摆摇楼主2024/8/13 10:40

72分...

#14~#20全TLE

不知道是我常数过大还是程序自己跑一半自闭(死循环)了

各位好心人帮帮蒟蒻吧...

#include <bits/stdc++.h>
//#include <bits/extc++.h>
using namespace std;
//using namespace __gnu_cxx;

#define debug cout<<"Ok"<<endl;
#define sc second
#define fr first
#define pb push_back
#define LL long long
typedef const int Int;
typedef pair<int,int> pii;
typedef double db;

Int N=6e7+5,M=5e5+5;

inline int read(){
    int x=0,f=1;
	char ch=getchar();
	while(ch>'9'||ch<'0'){
		if(ch=='-')f=-f;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=x*10+ch-'0';
		ch=getchar();
	}
    return x*f;
}

struct node{
	int ls,rs;
	int val;
	int rnk;
	int size;
};

node tr[N];
int tot;

int n,m,i;

int ver[M];
int qver;

void pushup(Int &p){
	tr[p].size=tr[tr[p].ls].size+tr[tr[p].rs].size+1;
}

inline Int clonep(Int &p){
	tr[++tot]=tr[p];
	return tot;
}

void split(int p,Int &v,int &x,int &y){
	if(!p){
		x=y=0;
		return;
	}
	p=clonep(p);
	if(tr[p].val<=v){
		x=p;
		split(tr[p].rs,v,tr[p].rs,y);
	}
	else{
		y=p;
		split(tr[p].ls,v,x,tr[p].ls);
	}
	pushup(p);
}

Int merge(Int &x,Int &y){
	if(!x||!y)return x+y;
	if(tr[x].val<=tr[y].val){
		tr[x].rs=merge(tr[x].rs,y);
		pushup(x);
		return x;
	}
	else{
		tr[y].ls=merge(x,tr[y].ls);
		pushup(y);
		return y;
	}
}

inline Int addp(Int &x){
	tr[++tot].size=1;
	tr[tot].rnk=rand();
	tr[tot].val=x;
	return tot;
}

void insert(Int &v){
	int x,y;
	split(ver[qver],v,x,y);
	int newnode=addp(v);
	ver[i]=merge(merge(x,newnode),y);
}

void delt(Int &v){
	int x,y,z;
	split(ver[qver],v,x,z);
	split(x,v-1,x,y);
	y=merge(tr[y].ls,tr[y].rs);
	ver[i]=merge(x,merge(y,z));
}

Int queryrank(Int &v){
	int x,y;
	split(ver[qver],v-1,x,y);
	int ret=tr[x].size;
	ver[i]=merge(x,y);
	return ret;
}

Int queryval(int rnk,int p=ver[qver]){
	register int L;
	while(p){
		L=tr[p].ls;
		if(tr[L].size+1==rnk)return tr[p].val;
		if(tr[L].size>=rnk)p=L;
		else p=tr[p].rs,rnk-=tr[L].size+1;
	}
	
}

Int querypre(Int &v){
	int x,y;
	split(ver[qver],v-1,x,y);
	int ret=queryval(tr[x].size,x);
	ver[i]=merge(x,y);
	return ret;
}

Int queryrev(Int &v){
	int x,y;
	split(ver[qver],v,x,y);
	int ret=queryval(1,y);
	ver[i]=merge(x,y);
	return ret;
}

int op,x;

int main(){
	srand((unsigned)time(NULL));
	n=read();
	insert(INT_MIN+1),insert(INT_MAX);
	for(i=1;i<=n;i++){
		qver=read(),op=read(),x=read();
		if(op==1)insert(x);
		if(op==2)delt(x);
		if(op==3)printf("%d\n",queryrank(x));
		if(op==4){
			ver[i]=clonep(ver[qver]);
			printf("%d\n",queryval(x+1));
		}
		if(op==5)printf("%d\n",querypre(x));
		if(op==6)printf("%d\n",queryrev(x));
	}
	return 0;
}	












2024/8/13 10:40
加载中...