hdu1512 monkey king 左偏树
2015-04-09 23:27
225 查看
题目大意:有n个猴子,一开始每个猴子只认识自己。每个猴子有一个力量值,力量值越大表示这个猴子打架越厉害。如果2个猴子不认识,他们就会找他们认识的猴子中力量最大的出来单挑,单挑不论输赢,单挑的2个猴子力量值减半,这2拨猴子就都认识了。现在给m组询问,如果2只猴子相互认识,输出-1,否则他们各自找自己认识的最牛叉的猴子单挑,求挑完后这拨猴子力量最大值。
就是一个并查集加左偏树。(左偏树这合并号强大
就是一个并查集加左偏树。(左偏树这合并号强大
#include<stdio.h> #define maxn 100010 #include<iostream> using namespace std; struct s { int l,r,dis,key; }mo[maxn]; int father[maxn],rk[maxn]; int find(int x) //寻找父节点 { while(x!=father[x]) { x=father[x]; } return x; } int merge( int a, int b ) {//合并 if( a == 0 ) return b; if( b == 0 ) return a; if( mo[a].key < mo[b].key ) swap( a, b ); mo[a].r = merge( mo[a].r, b ); father[mo[a].r ]=a; //标记 if( mo[mo[a].l].dis < mo[mo[a].r].dis ) swap( mo[a].l, mo[a].r ); if( mo[a].r == 0 ) mo[a].dis = 0; else mo[a].dis = mo[mo[a].r].dis + 1; return a; } int pop( int a ) { //把a的两个子树合并 int l = mo[a].l; int r = mo[a].r; mo[a].l = mo[a].r = mo[a].dis = 0; return merge(l, r); } int main() { int n,m,x,y,fx,fy; while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) { scanf("%d",&mo[i].key); mo[i].l=mo[i].r=mo[i].dis=0; father[i]=i; rk[i]=0; } // build(); scanf("%d",&m); while(m--) { scanf("%d%d",&x,&y); // printf("father[3]=%d\n",father[3]); fx=find(x); fy=find(y); if(fx!=fy) { mo[fx].key /= 2; int u = pop( fx ); u = merge( u, fx ); mo[fy].key /= 2; int v = pop( fy ); v = merge( v, fy ); int p=merge( u, v ); father[x]=father[y]=father[fx]=father[fy]=father[u]=father[v]=p; printf( "%d\n", mo[p].key); } else printf("-1\n"); } } return 0; }
相关文章推荐
- 左偏树自己的一点理解【hdu1512】【Monkey King】
- ZOJ2334 HDU1512 Monkey King,左偏树
- 【HDU1512】【左偏树】Monkey King 题解
- 左偏树+并查集 hdu1512 Monkey King
- 【HDU1512】Monkey King-左偏树+并查集(左偏树入门题)
- 左偏树自己的一点理解【hdu1512】【Monkey King】
- HDOJ 1512 Monkey King -- 左偏树
- 【左偏树】【ZOJ 2334】Monkey King
- hdu1512 & zoj2334Monkey King (左偏树 + 并查集(非优化的朴素并查集))
- hdu 1512 Monkey King (左偏树 可并堆)
- HDU1512 Monkey King【并查集+左偏树】
- ZOJ 2334(Monkey King-左偏树第一题)
- ZOJ 2334 Monkey King(左偏树)
- hdu1512 Monkey King
- 【HDU】1512 Monkey King 左偏树
- ZOJ 2334(Monkey King-左偏树第一题)
- zoj2334 Monkey King , 并查集,可并堆,左偏树
- HDU 1512 Monkey King 可并堆,左偏树
- HDU1512 (左偏树)
- 数据结构(左偏树):HDU 1512 Monkey King