题意:有一群猴子,每一只有一定的强壮值
刚开始,每个人都不认识别人
有m次争吵
若x,y争吵
如果 x认识y 输出-1
如果x不认识y 则x认识的猴子中(包括自己)当前强壮值最大的和y认识的猴子中(包括自己)当前强壮值最大的决斗
决斗完之后,决斗的两只猴子,强壮值减半(10->5,5->2) 且x认识的猴子和y认识的猴子都相互认识了 输出其中当前强壮值的最大值
多组数据
思路:左偏树
1 #include2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 100000+100 8 struct node 9 {10 int num,NPL;11 int left,right;12 };13 node tree[MAXN];14 int n,m;15 int f[MAXN],root[MAXN];16 int find(int x)17 {18 return f[x]==-1? x:f[x]=find(f[x]);19 }20 int Union(int x,int y)21 {22 f[find(x)]=find(y);23 }24 int merge(int x,int y)25 {26 if(x==0) return y;27 if(y==0) return x;28 if(tree[y].num>tree[x].num) 29 swap(x,y);30 tree[x].right=merge(tree[x].right,y);31 32 if(tree[tree[x].left].NPL