hdu1512 & zoj2334Monkey King (左偏树 + 并查集(非优化的朴素并查集))

在一个森林里住着N(N<=10000)只猴子。
在一开始,他们是互不认识的。但是随着时间的推移,猴子们少不了争斗,但那只会发生在互不认识(认识具有传递性)的两群猴子之间(可能只有他们自己)。
争斗时,两群猴子都会请出他们里面最强壮的一只(有可能是他自己)进行争斗。
争斗后,这两群猴子就互相认识。 
每个猴子有一个强壮值,但是被请出来的那两只猴子进行争斗后,他们的强壮值都会减半(例如10会减为5,5会减为2)。
现给出每个猴子的初始强壮值,给出M次争斗,
如果争斗的两只猴子不认识,那么输出争斗后两只猴子的认识的猴子里最强壮的猴子的强壮值,否则输出-1。


hdu  http://acm.hdu.edu.cn/showproblem.php?pid=1512

zoj  http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2334


左偏树入门详见讲义,要先看看讲义理解理解左偏树的实现,下载链接

http://download.csdn.net/detail/hnust_taoshiqian/8941099


#include
#include
#include
#include
#include
#define MT(x,i) memset(x,i,sizeof(x))
using namespace std;
const int maxn=100000+10;
int tot,v[maxn],l[maxn],r[maxn],d[maxn],fa[maxn];
///value,left,right,dist(到最近外点的距离(外点:没有两个儿子的点))
int Merge(int x,int y){
    if(x==y) return x;
    if(!x) return y;
    if(!y) return x;
    if(v[x]y。根最大
    r[x]=Merge(r[x],y);
    fa[r[x]]=x;///更新父亲
    if(d[l[x]]v[fy]) printf("%d\n",v[fx]);
            else printf("%d\n",v[fy]);
            Merge(fx,fy);
        }
    }
    return 0;
}


你可能感兴趣的:(数据结构)