FHQ求条
查看原帖
FHQ求条
1164775
Jadonyzx楼主2024/10/5 21:49
#include<bits/stdc++.h>
#define eps 1e-7
#define maxn 660010
#define double long double
using namespace std;
int n,m,root,cnt;mt19937 rnd(time(0));
struct FHQ_treap{double val;unsigned long long key;int lson,rson,siz,id;}treap[maxn];
double value[maxn],maxx,minx;
void addnode(double val,int id){
	treap[++cnt].val=val;
	treap[cnt].id=id;
	treap[cnt].lson=treap[cnt].rson=0;
	treap[cnt].siz=1;
	treap[cnt].key=rnd();
	return;
}
void update(int id){
	treap[id].siz=treap[treap[id].lson].siz+treap[treap[id].rson].siz+1;
	return;
}
int merge(int l,int r){
	if(!l||!r)return l+r;
	if(treap[l].key<treap[r].key){
		treap[r].lson=merge(l,treap[r].lson);
		update(r);
		return r;
	}
	else{
		treap[l].rson=merge(treap[l].rson,r);
		update(l);
		return l;
	}
}
void spilt(int now,double val,int &x,int &y){
	if(!now){x=y=0;return;}
	if(treap[now].val<=val){
		x=now;
		spilt(treap[now].rson,val,treap[now].rson,y);
		update(x);
	}
	else{
		y=now;
		spilt(treap[now].lson,val,x,treap[now].lson);
		update(y);
	}
	return;
}
void insert(double val,int uid){
	int x,y;x=y=0;
	spilt(root,val,x,y);
	addnode(val,uid);
	root=merge(merge(x,cnt),y);
	return;
}
void del(double val){
	int x,y,z;x=y=z=0;
	spilt(root,val,x,z);
	spilt(x,val-eps,x,y);
	y=merge(treap[y].lson,treap[y].rson);
	root=merge(merge(x,y),z);
	return;
}
int find_by_id(int now,int id){
	if(!now)return -1;
	if(treap[now].val==value[id])return now;
	else if(treap[now].val<value[id])return find_by_id(treap[now].rson,id);
	else return find_by_id(treap[now].rson,id);
}
int Val_to_Rank(double val){
	int lt,rt;lt=rt=0;
	spilt(root,val-eps,lt,rt);
	int res=treap[lt].siz+1;
	root=merge(lt,rt);
	return res;
}
int Rank_to_Id(int now,int ranking){
	if(treap[treap[now].lson].siz+1==ranking)return treap[now].id;
	else if(treap[treap[now].lson].siz+1<ranking)
		return Rank_to_Id(treap[now].rson,ranking-treap[treap[now].lson].siz-1);
	else 
		return Rank_to_Id(treap[now].lson,ranking);
}
double Rank_to_Val(int now,int ranking){
	if(treap[treap[now].lson].siz+1==ranking)return treap[now].val;
	else if(treap[treap[now].lson].siz+1<ranking)
		return Rank_to_Val(treap[now].rson,ranking-treap[treap[now].lson].siz-1);
	else 
		return Rank_to_Val(treap[now].lson,ranking);
}
void Top(int s){
	int place=find_by_id(root,s);
	double pre=value[s];
	value[s]=minx-1.0;minx-=1.0;
	del(pre);
	insert(value[s],s);
	return;
}
void Bottom(int s){
	int place=find_by_id(root,s);
	double pre=value[s];
	value[s]=maxx+1.0;maxx+=1.0;
	del(pre);
	insert(value[s],s);
	return;
}
void Insert(int s,int t){
	if(t==0)return;
	int rks=Val_to_Rank(value[s]);
	double nxt=Rank_to_Val(root,rks+t);
	del(value[s]);
	if(t>0)value[s]=nxt+eps*2;
	else if(t<0)value[s]=nxt-eps*2;
	insert(value[s],s);
	return;
}
int Ask(int s){return Val_to_Rank(value[s])-1;}
int Query(int s){return Rank_to_Id(root,s);}
signed main(){
//	freopen("P2596.in","r",stdin);
//	freopen("P2596.out","w",stdout);
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;minx=101.00;maxx=n+100.00;
	for(int i=1;i<=n;++i){
		int p;cin>>p;
		value[p]=i*1.0+100.00;
		insert(value[p],p);
	}
	while(m--){
		string op;cin>>op;
		if(op=="Top"){int s;cin>>s;Top(s);}
		else if(op=="Bottom"){int s;cin>>s;Bottom(s);}
		else if(op=="Insert"){int s,t;cin>>s>>t;Insert(s,t);}
		else if(op=="Ask"){int s;cin>>s;cout<<Ask(s)<<'\n';}
		else {int s;cin>>s;cout<<Query(s)<<'\n';}
	}
	return 0;
}
2024/10/5 21:49
加载中...