求助,Subtask MLE
查看原帖
求助,Subtask MLE
777854
Patrickpanpan楼主2024/11/27 19:23
#include<bits/stdc++.h>
using namespace std;
const int N=100001;
struct fhq_treap 
{
	int val,pri;
	int size;
	int l,r;
}tr[N];
int root1,root2; 
int root[N];
int num;
int n,m; 
int fa[N];
int ord[N];
int create(int x)
{
	tr[++num].size=1;
	tr[num].pri=rand();
	tr[num].val=x;
	return num;
}
void init()
{
	for(int i=1;i<=n;i++)
	{
		fa[i]=i;
	}
} 
int get(int x)
{
	if(x==fa[x])return x;
	return fa[x]=get(fa[x]);
}
void pushup(int id)
{
	tr[id].size=tr[tr[id].l].size+tr[tr[id].r].size+1;
	return;
}
void split_tree(int id,int val,int &l,int &r)
{
	if(id==0)
	{
		l=r=0;
		return;
	}
	if(tr[id].val<=val)
	{
		l=id;
		split_tree(tr[id].r,val,tr[id].r,r);
	}
	else
	{
		r=id;
		split_tree(tr[id].l,val,l,tr[id].l);
	}
	pushup(id);
	return;
}
int merge_tree(int l,int r)
{
	if(l==0 || r==0)return l+r;
	if(tr[l].pri<tr[r].pri)
	{
		tr[l].r=merge_tree(tr[l].r,r);
		pushup(l);
		return l;
	}
	else
	{
		tr[r].l=merge_tree(l,tr[r].l);
		pushup(r);
		return r;
	}
}
void insert(int &rt,int id)
{
	split_tree(rt,tr[id].val,root1,root2);
	rt=merge_tree(merge_tree(root1,id),root2);
	return;
}
void Merge(int &T1,int T2)//将T2合并至T1  
{
	if(tr[T2].l!=0)Merge(T1,tr[T2].l);
	if(tr[T2].r!=0)Merge(T1,tr[T2].r);
	insert(T1,T2);
}
int query(int id,int rk)
{
	if(id==0)return -1;
	if(tr[tr[id].l].size+1==rk)
	{
		return tr[id].val;
	}
	if(tr[tr[id].l].size+1<rk)
	{
		return query(tr[id].r,rk-tr[tr[id].l].size-1);
	}
	if(tr[tr[id].l].size+1>rk)
	{
		return query(tr[id].l,rk);
	}
}
int main()
{
	cin>>n>>m;
	init();
	int x,y;
	for(int i=1;i<=n;i++)
	{
	
		cin>>x;
		ord[x]=i;
		root[i]=create(x);
	}
	for(int i=1;i<=m;i++)
	{
		cin>>x>>y;
		x=get(x);
		y=get(y);
		if(x!=y)
		{
			if(tr[root[y]].size<tr[root[x]].size)
			{
				swap(x,y);
			}
			//tr[y].size>tr[x].size 让x合并到y里 
			fa[x]=y;
			Merge(root[y],root[x]);//将x合并至y 
		}
	}
	int q;
	cin>>q; 
	for(int apple=1;apple<=q;apple++)
	{
		cout<<apple<<endl;	
		char op;
		cin>>op; 
		if(op=='Q')
		{
			int x,k;
			cin>>x>>k; 
			if(tr[root[get(x)]].size<k)cout<<-1<<endl; 
			else cout<<ord[query(root[get(x)],k)]<<endl;;
		}
		if(op=='B')
		{
			int x,y;
			cin>>x>>y;
			
			x=get(x);
			y=get(y);
			if(x!=y)
			{
				if(tr[root[y]].size<tr[root[x]].size)
				{
					swap(x,y);
				}
				fa[x]=y;
				Merge(root[y],root[x]);//将x合并至y 
			}
		}
	} 
	return 0;
}
2024/11/27 19:23
加载中...