bzoj1455

Description

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

Input

第一行一个整数n(1<=n<=1000000)。n表示士兵数,m表示总命令数。 第二行n个整数,其中第i个数表示编号为i的士兵的分数。(分数都是[0..10000]之间的整数) 第三行一个整数m(1<=m<=100000) 第3+i行描述第i条命令。命令为如下两种形式: 1. M i j 2. K i

Output

如果命令是Kill,对应的请输出被杀人的分数。(如果这个人不存在,就输出0)

Sample Input

5
100 90 66 99 10
7
M 1 5
K 1
K 1
M 2 3
M 3 4
K 5
K 4

Sample Output

10
100
0
66
左偏树裸题详见刘汝佳《高级数据结构》【应该没有讲的比那个好的ppt了】
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string>
 4 #include<string.h>
 5 #include<iostream>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<math.h>
 9 #include<vector>
10 #include<map>
11 #include<set>
12 #define il inline
13 #define re register
14 using namespace std;
15 const int N=1000010;
16 int n,f[N],l[N],r[N],d[N],v[N],Q;
17 bool die[N];
18 il int read(){
19     re int hs=0;re char c=getchar();
20     while(!isdigit(c)) c=getchar();
21     while(isdigit(c)){
22         hs=(hs<<3)+(hs<<1)+c-'0';
23         c=getchar();
24     }
25     return hs;
26 }
27 il void swap(re int &a,re int &b){
28     a^=b;
29     b^=a;
30     a^=b;
31 }
32 il int getfather(re int u){
33     return f[u]==u?u:f[u]=getfather(f[u]);
34 }
35 il int merge(re int a,re int b){
36     if(!a) return b;
37     if(!b) return a;
38     if(v[a]>v[b]) swap(a,b);
39     r[a]=merge(r[a],b);
40     if(d[r[a]]>d[l[a]]) swap(l[a],r[a]);
41     d[a]=d[r[a]]+1;
42     return a;
43 }
44 int main(){
45     n=read();char str[9];
46     for(int i=1;i<=n;i++) v[i]=read();
47     for(int i=1;i<=n;i++) f[i]=i;
48     Q=read();d[0]=-1;
49     for(re int i=1,p,q,fp,fq;i<=Q;i++){
50         scanf("%s",str);p=read();
51         if(str[0]=='M'){
52             q=read();
53             if(die[p]||die[q]) continue;
54             fp=getfather(p);
55             fq=getfather(q);
56             if(fp!=fq) f[fp]=f[fq]=merge(fp,fq);
57         }
58         else{
59             if(die[p]) printf("0\n");
60             else{
61                 q=getfather(p);die[q]=1;
62                 printf("%d\n",v[q]);
63                 f[q]=merge(l[q],r[q]);
64                 f[f[q]]=f[q];
65             }
66         }
67     }
68     return 0;
69 }

 

蜉蝣渴望着飞翔,尽管黄昏将至
posted @ 2016-08-24 15:34  ExiledPoet  阅读(225)  评论(0编辑  收藏  举报