萌新刚学可持久化FHQ-Treap 0ms,WA/RE/MLE 24pt求调
查看原帖
萌新刚学可持久化FHQ-Treap 0ms,WA/RE/MLE 24pt求调
760433
zcz0263楼主2024/4/28 18:41

rt,#1~#2 #21~#24 AC,#3~#20 WA,#25 RE/WA/MLE

#include<bits/stdc++.h>
using namespace std;
using namespace __gnu_cxx;
//#define int long long
#ifndef int
#define INF INT_MAX
#endif
#ifdef int
#define INF LLONG_MAX
#endif
#define pii pair<int,int>
#define vi vector<int>
#define pipii pair<int,pii>
#define vpii vector<pair<int,int>>
#define _max(x,y) (((x)>(y))?(x):(y))
#define _min(x,y) (((x)<(y))?(x):(y))
#define max(...) max({__VA_ARGS__})
#define min(...) min({__VA_ARGS__})
#define tomax(x,...) ((x)=max((x),__VA_ARGS__))
#define tomin(x,...) ((x)=min((x),__VA_ARGS__))
#define tomx(x,...) tomax(x,__VA_ARGS__)
#define tomn(x,...) tomin(x,__VA_ARGS__)
#define link tfshtrj
#define y1 drshzhsrd
#define mkp make_pair
#define pb push_back
#define eb(x) emplace_back(x)
#define rep(x,y,z) for(int x=(y);x<=(z);x++)
#define per(x,y,z) for(int x=(y);x>=(z);x--)
#define all(x) x.begin(),x.end()
#define allt(x,y,z) x.begin()+y,x.begin()+z
#define fi first
#define se second
//-O2 -std=c++14 -DONLINE_JUDGE -Wall -Wextra -Wl,-stack=536870912
#define ls(x) x->son[0]
#define rs(x) x->son[1]
#define siz(x) ((x)?(x->siz):0)
mt19937_64 gen(random_device{}());
 
uniform_int_distribution<int> rnd(1,INF>>1);
struct node{
	node* son[2];
	int val,prio,cnt,siz;
	node(int v=0){
		val=v,cnt=1,siz=1;
		son[0]=son[1]=0;
		prio=rnd(gen);
	}
	node(node*y){
		son[0]=y->son[0];
		son[1]=y->son[1];
		val=y->val;
		prio=y->prio;
		cnt=y->cnt;
		siz=y->siz;
	}
	void pushup(){
		siz=cnt;
		siz+=siz(son[0]);
		siz+=siz(son[1]);
	}
}*root[500005*40];
pair<node*,node*> split(node*p,int key){
	if(nullptr==p) return {0,0};
	if(p->val<=key){
		auto t=split(rs(p),key);
		rs(p)=t.fi;
		p->pushup();
		return {p,t.se};
	}else{
		auto t=split(ls(p),key);
		ls(p)=t.se;
		p->pushup();
		return {t.fi,p};
	}
}
node* merge(node*u,node*v){
	if((nullptr==u)&&(nullptr==v)) return 0;
	if(u&&(nullptr==v)) return u;
	if((nullptr==u)&&v) return v;
	if(u->prio<v->prio){
		rs(u)=merge(rs(u),v);
		u->pushup();
		return u;
	}else{
		ls(v)=merge(u,ls(v));
		v->pushup();
		return v;
	}
}
void insert(int pre,int now,int val){
	if(root[pre]) root[now]=new node(root[pre]);//cout<<__LINE__<<endl;
	auto t=split(root[now],val);
	auto lt=split(t.fi,val-1);
	node* newn;
	if(nullptr==lt.se){
		newn=new node(val);
	}else{
		lt.se->cnt++;
		lt.se->siz++;
	}
	auto lt2=merge(lt.fi,lt.se?lt.se:newn);
	root[now]=merge(lt2,t.se);
}
void erase(int pre,int now,int val){
	if(root[pre]) root[now]=new node(root[pre]);
	auto t=split(root[now],val);
	auto lt=split(t.fi,val-1);
	if(lt.se->cnt>1){
		lt.se->cnt--;
		lt.se->siz--;
		lt.fi=merge(lt.fi,lt.se);
	}else{
		if(t.fi==lt.se) t.fi=0;
		delete lt.se;
		lt.se=0;
	}
	root[now]=merge(lt.fi,t.se);
}
int askrnk(node*& p,int val){
	auto t=split(p,val-1);
	int rnk=(t.fi?t.fi->siz+1:1);
	p=merge(t.fi,t.se);
	return rnk;
}
//int askval(node*p,int rk){
////assert(p);assert(ls(p));
////	if(!p) assert(0);
////	assert(p);
////	if((ls(p)?ls(p)->siz:0)>=rk) return askval(ls(p),rk);
////	if(p->cnt+(ls(p)?ls(p)->siz:0)>=rk) return p->val;
////	return /*assert(rs(p)),*/askval(rs(p),rk-(ls(p)?ls(p)->siz:0)-p->cnt);
//	//assert(ls(p));
//	if(rk<=siz(ls(p)))return askval(ls(p),rk);
//	else if(rk<=siz(ls(p))+p->cnt)return p->val;
//	else return askval(ls(p),rk-siz(ls(p))-p->cnt);
//}
int askval(node*&p,int rk){
//assert(p);assert(ls(p));
//	if(!p) assert(0);
//	assert(p);
	if((ls(p)?ls(p)->siz:0)>=rk) return askval(ls(p),rk);
	if(p->cnt+(ls(p)?ls(p)->siz:0)>=rk) return p->val;
	return /*assert(rs(p)),*/askval(rs(p),rk-(ls(p)?ls(p)->siz:0)-p->cnt);
}
int askpre(node*p,int val){
//	assert(p);
//  
//	auto t=split(p,val-1);
//	cout<<"askpre2: "<<(t.fi?t.fi->siz:-1)<<"\n";
//	int ans=askval(t.fi,t.fi->siz);
//	p=merge(t.fi,t.se);
//	return ans;
	int ans=INT_MIN+1;
	while(p){
//		cout<<"askpre"<<(p?p->val:-1)<<endl;
		if(p->val<val){
			ans=max(p->val,ans);
			p=rs(p);
		}else p=ls(p);
	}
	return ans;
}
int asknxt(node*p,int val){
	assert(p);
//	cout<<"asknxt"<<(p?p->val:-1)<<endl;
//	auto t=split(p,val);
//	int ans=askval(t.se,1);
//	p=merge(t.fi,t.se);
//	return ans;
	int ans=INT_MAX;
	while(p){
		if(p->val>val){
			ans=min(p->val,ans);
			p=ls(p);
		}else p=rs(p);
	}
	return ans;
}
#define val(x) ((x)?(x->val):-1)
void debug(node*p){
	if(!p) return;
	cout<<"dot: "<<val(p)<<"\nson: "<<val(ls(p))<<" "<<val(rs(p))<<endl;
	debug(ls(p));
	debug(rs(p));
}
int x,n,m,op,ans,last,v;
main(){
	ios::sync_with_stdio(0),cin.tie(nullptr);
	cin>>m;
	rep(i,1,m){
		cin>>v>>op>>x;
		if(op==1) insert(v,i,x);
		else if(op==2) erase(v,i,x);
		else if(op==3) cout<<askrnk(root[v],x)<<"\n";
		else if(op==4) cout<<askval(root[v],x)<<"\n";
		else if(op==5) cout<<askpre(root[v],x)<<"\n";
		else cout<<asknxt(root[v],x)<<"\n";
		if(op>2){
			root[i]=new node(root[v]);
		}
	}
}
2024/4/28 18:41
加载中...