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)); } } }
相关文章推荐
- BZOJ 1455 罗马游戏 可并堆裸
- 【bzoj1455】罗马游戏 可并堆
- BZOJ 1455 罗马游戏
- BZOJ 1455: 罗马游戏 左偏树 or pb_ds
- 【BZOJ-1455】罗马游戏 可并堆 (左偏树)
- [BZOJ1455] 罗马游戏
- BZOJ 1455 罗马游戏【可并堆+并查集
- bzoj1455 罗马游戏(左偏树(可并堆)+ 并查集)
- BZOJ 1455 罗马游戏 左偏树
- [Random Heap 并查集] BZOJ 1455 罗马游戏
- 【BZOJ】1455 罗马游戏 左偏树
- BZOJ[1455]罗马游戏 可并堆
- BZOJ-1455 罗马游戏
- bzoj 1455: 罗马游戏 左偏树
- bzoj1455 罗马游戏 左偏树
- 【BZOJ1455】罗马游戏
- BZOJ1455 罗马游戏
- 【BZOJ1455】罗马游戏
- 【左偏堆】bzoj1455罗马游戏
- BZOJ 1455 罗马游戏