bzoj1455

可并堆或set+并查集。。。

set:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<cmath>
 5 #include<ctime>
 6 #include<cstdlib>
 7 #include<algorithm>
 8 #include<set>
 9 #define lowbit(a) ((a)&(-(a)))
10 #define clr(a,x) memset(a,x,sizeof(a))
11 #define rep(i,l,r) for(int i=l;i<(r);i++)
12 using namespace std;
13 typedef long long ll;
14 typedef pair<int,int> pii;
15 int read()
16 {
17     char c=getchar();
18     int ans=0,f=1;
19     while(!isdigit(c)){
20         if(c=='-') f=-1;
21         c=getchar();
22     }
23     while(isdigit(c)){
24         ans=ans*10+c-'0';
25         c=getchar();
26     }
27     return ans*f;
28 }
29 const int maxn=1000009;
30 int n,m,f[maxn];
31 set<pii>S[maxn];
32 bool p[maxn];
33 int find(int x){
34     return f[x]==x?f[x]:f[x]=find(f[x]);
35 }
36 int main()
37 {    
38     rep(i,1,maxn) f[i]=i;clr(p,1);
39     n=read();
40     rep(i,1,n+1){
41         int t=read();
42         S[i].insert(make_pair(t,i));
43     }
44     m=read();
45     while(m--){
46         char opt=getchar();
47         while(opt!='M'&&opt!='K') opt=getchar();
48         if(opt=='M'){
49             int x=read(),y=read();
50             if(!p[x]||!p[y]) continue;
51             x=find(x);y=find(y);
52             if(x==y) continue;
53             if(S[x].size()>S[y].size()) swap(x,y);f[x]=y;
54             while(!S[x].empty()){
55                 pii o=*S[x].begin();S[x].erase(S[x].begin());
56                 S[y].insert(o);
57             }
58         }else{
59             int x=read();
60             if(!p[x]){
61                 puts("0");
62                 continue;
63             }
64             x=find(x);
65             pii o=*S[x].begin();S[x].erase(S[x].begin());
66             p[o.second]=0;
67             printf("%d\n",o.first);
68         }
69     }
70     return 0;
71 }
View Code

可并堆(回学校再来):

 

1455: 罗马游戏

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 877  Solved: 354
[Submit][Status][Discuss]

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

HINT

 

Source

posted @ 2015-09-20 16:43  ChenThree  阅读(163)  评论(0编辑  收藏  举报