您的位置:首页 > 其它

bzoj 1455: 罗马游戏

2018-03-01 21:57 495 查看

题意:

罗马皇帝很喜欢玩杀人游戏。 他的军队里面有n个人,每个人都是一个独立的团。最近举行了一次平面几何测试,每个人都得到了一个分数。 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以鼻。他决定玩这样一个游戏。 它可以发两种命令: 1. Merger(i, j)。把i所在的团和j所在的团合并成一个团。如果i, j有一个人是死人,那么就忽略该命令。 2. Kill(i)。把i所在的团里面得分最低的人杀死。如果i这个人已经死了,这条命令就忽略。 皇帝希望他每发布一条kill命令,下面的将军就把被杀的人的分数报上来。(如果这条命令被忽略,那么就报0分)

题解:

左偏树裸题,不会的话看下代码就好了。

code:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
struct trnode{
int lc,rc,d,c,fa;
}tr[1000010];
int n,m,kill[1000010];
int findfa(int x) {return tr[x].fa==x?x:tr[x].fa=findfa(tr[x].fa);}
int merge(int x,int y)
{
if(!x) return y;
if(!y) return x;
if(tr[x].c>tr[y].c) swap(x,y);
tr[x].rc=merge(tr[x].rc,y);tr[tr[x].rc].fa=x;
if(tr[tr[x].lc].d<tr[tr[x].rc].d) swap(tr[x].lc,tr[x].rc);
tr[x].d=tr[tr[x].rc].d+1;
return x;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&tr[i].c);
tr[i].fa=i;
}
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
char s[2];scanf("%s",s+1);
if(s[1]=='K')
{
int x;scanf("%d",&x);
if(kill[x]) printf("0\n");
else
{
int y=findfa(x);
printf("%d\n",tr[y].c);
int t=merge(tr[y].lc,tr[y].rc);
tr[y].fa=tr[t].fa=t;kill[y]=1;
}
}
else
{
int x,y;scanf("%d %d",&x,&y);
if(kill[x]||kill[y]||findfa(x)==findfa(y)) continue;
tr[findfa(x)].fa=tr[findfa(y)].fa=merge(findfa(x),findfa(y));
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: