[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 }