求助
  • 板块P2713 罗马游戏
  • 楼主01bit
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/2/23 17:05
  • 上次更新2023/11/5 02:49:38
查看原帖
求助
338147
01bit楼主2021/2/23 17:05
#include<cstdio>
using namespace std;
int n,m;
struct node{
	int v,s=0,b=0,root;
}tree[1000001];
bool k[1000001];
int merge(int x,int y){
    if(!x)return y;
    if(!y)return x;
	if(tree[x].v>tree[y].v){int nd=y;x=y;y=nd;}
	tree[y].b=tree[x].s;
	tree[x].s=y;
	return x;
}
int merges(int x){
	if(!x||!tree[x].b)return x;
	int b1=tree[x].b,b2=tree[b1].b;
	tree[x].b=tree[b1].b=0;
	return merge(merge(x,b1),merges(b2));
}
int pop(int x){
	return merges(tree[x].s);
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&(tree+i)->v),tree[i].root=i;
	scanf("%d\n",&m);
	while(m--){
		char op;
		scanf("%c ",&op);
		if(op=='M'){
			int i,j;
			scanf("%d %d\n",&i,&j);
			if(!k[i]&&!k[j])tree[i].root=tree[j].root=merge(tree[i].root,tree[j].root);
		}
		if(op=='K'){
			int i;
			scanf("%d\n",&i);
			if(k[i]){printf("0\n");continue;}
			int root=tree[i].root;
			k[root]=true;
			tree[i].root=pop(root);
			printf("%d\n",tree[root].v);
		}
	}
	return 0;
}

2021/2/23 17:05
加载中...