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
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
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 "); 60 else{ 61 q=getfather(p);die[q]=1; 62 printf("%d ",v[q]); 63 f[q]=merge(l[q],r[q]); 64 f[f[q]]=f[q]; 65 } 66 } 67 } 68 return 0; 69 }