题意:有n只猴子,m个操作,每一个操作,会让这两堆猴子里的最大的两只打架,打完之后,自身权值减半,然后他们会成为朋友

也就是会属于同一棵树,细节:如果选出的猴子在同一堆,就输出-1,然后下一个操作,不用打架;

 #include<cstdio>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
const int maxn=1e5+;
int val[maxn];
int f[maxn];
int ch[maxn][];
int dis[maxn];
int getf(int x) //标准并查集
{
if(f[x]==x) return x;
else{
f[x]=getf(f[x]);
return f[x];
}
}
int Merge(int x,int y)
{
if(!x||!y) return x+y; //到底了;
//保证最小堆性质 后面这个不懂
if(val[x]<val[y]) swap(x,y);
//这个大概就是创这个算法的人的习惯了,将其定在右子树。
//然后再在下面进行操作来满足偏左树的性质;
ch[x][]=Merge(ch[x][],y);
f[ch[x][]]=x; //并查集操作;
//满足偏左;
if(dis[ch[x][]]<dis[ch[x][]]) swap(ch[x][],ch[x][]);
//这个是偏左树的性质,想想就知道是对的。
dis[x]=dis[ch[x][]]+;
return x;
}
int main()
{
int n,m;
while(scanf("%d",&n)!=EOF){
memset(dis,,sizeof(dis));
memset(ch,,sizeof(ch));
for(int i=;i<=n;i++){
scanf("%d",&val[i]);
f[i]=i;
}
scanf("%d",&m);
while(m--){
int t1,t2;
scanf("%d%d",&t1,&t2);
int u=getf(t1);
int v=getf(t2);
if(u==v){
printf("-1\n");
continue;
}
val[u]/=;
int root=Merge(ch[u][],ch[u][]);
ch[u][]=ch[u][]=dis[u]=;
int newx=Merge(root,u);
val[v]/=;
root=Merge(ch[v][],ch[v][]);
ch[v][]=ch[v][]=dis[v]=;
int newy=Merge(root,v);
root=Merge(newx,newy);
f[newx]=f[newy]=root; //这里两个点都要,其实只有一个点需要,
//因为只有一个点的父节点没有从已经被减半的根节点那更新回来。
//需要更新的点是根节点;
printf("%d\n",val[root]);
}
}
return ;
}

最新文章

  1. linux test 命令使用
  2. SQLSERVER进程CPU使用率100%
  3. Delphi 2 Unleashed (一) 介绍
  4. 构建第一个Java程序
  5. 树莓派2 安装mono3.0运行mvc4
  6. 虚拟主机apache
  7. 时间处理得到UTC时间
  8. ALV DataChange EVENT
  9. ubuntu下一个rootusername入口mysql,如何查看username和password,如何改变rootpassword
  10. auto tool: make -2014-1210-0001
  11. mysql 1053错误,无法启动的解决方法
  12. python入门(7)Python程序的风格
  13. [LeetCode] Pour Water 倒水
  14. python学习之路前端-CSS
  15. Spark大型电商项目实战-及其改良(2) RDD优化效果不稳定的真正原因
  16. standby_file_management参数为MANUAL导致添加数据文件错误
  17. 16. Antimalware (反病毒 3个)
  18. 关于EOF的使用的好文章
  19. 在 jupyter 中添加菜单和自动完成功能
  20. unity3d 代码动态添加,修改BoxCollider2D

热门文章

  1. js前后端交互
  2. 软件架构期末复习(Struts2+Spring+Hibernate)
  3. Progressbar 实例
  4. 虚拟机中的CentOS 7设置固定IP连接最理想的配置(转载)
  5. 机器学习作业(六)支持向量机——Matlab实现
  6. 启动Hive时报错(com.mysql.jdbc.Driver&quot;) was not found in the CLASSPATH)
  7. 走进电影院观看VTK
  8. Linux 环境c++ 编码转换
  9. Javascript数组与字符串常用api
  10. 如何把U盘的两个盘或者多个盘合成一个