[bzoj1455]罗马游戏

可并堆裸题

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1000010;
 4 struct heap{
 5     int l,r,w,d;
 6     heap(){
 7         l=r=w=d=0;
 8     }
 9     int top(){
10         return w;
11     }
12 }h[N];
13 int dad[N]; 
14 inline int merge(int x,int y){
15     int t;
16     if(!x||!y) return x+y;
17     if(h[x].w>h[y].w)swap(x,y);
18     h[x].r=merge(y,h[x].r);
19     int &l=h[x].l,&r=h[x].r;
20     if(h[l].d<h[r].d)
21     swap(l,r);
22     h[x].d=h[r].d+1;
23     dad[l]=dad[r]=x;
24     return x;
25 }
26 void pop(int x){
27     int l=h[x].l,r=h[x].r;
28     h[x].l=h[x].r=h[x].w=0;
29     int t=merge(l,r);dad[t]=t;
30 }
31 int find(int x){
32     return dad[x]==x?x:find(dad[x]);
33 }
34 bool die[N];
35 int main(){
36     int n;scanf("%d",&n);
37     for(int i=1;i<=n;i++)
38     scanf("%d",&h[i].w),dad[i]=i;
39     int m;scanf("%d",&m);
40     char ch[10];
41     while(m--){
42         scanf("%s",ch);
43         if(ch[0]=='M'){
44             int x,y;scanf("%d%d",&x,&y);
45             if(die[x]||die[y])continue;
46             x=find(x),y=find(y);
47             if(x^y)merge(x,y);
48         }
49         else{
50             int x;scanf("%d",&x);
51             if(die[x]){
52                 printf("0\n");continue;
53             }
54             int t=find(x);
55             printf("%d\n",h[t].top());
56             die[t]=1;pop(t);
57         }
58     }
59 }

 

posted @ 2017-08-28 11:35  orzzz  阅读(167)  评论(0编辑  收藏  举报