题意:有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 ;
}

左偏树(p1456) 比较模板的一道题的更多相关文章

  1. 左偏树 P3377【模板】左偏树(可并堆)

    题目传送门 代码: /* code by: zstu wxk time: 2019/03/01 */ #include<bits/stdc++.h> using namespace std ...

  2. 左偏树(p4431)

    难得不是左偏树,而是思维: 这道题在做得时候,有两个性质 1.如果a是一个不下降序列,那么b[i]==a[i]时取得最优解. 2.如果a是一个严格递减序列,则取a序列的中位数x,令b[1]=b[2]= ...

  3. 洛谷 P3377 【模板】左偏树(可并堆)

    洛谷 P3377 [模板]左偏树(可并堆) 题目描述 如题,一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或 ...

  4. [Luogu3377]【模板】左偏树(可并堆)

    题面戳我 题目描述 如题,一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或第y个数已经被删除或第x和第y个数 ...

  5. HDU 1512 Monkey King(左偏树模板题)

    http://acm.hdu.edu.cn/showproblem.php?pid=1512 题意: 有n只猴子,每只猴子一开始有个力量值,并且互相不认识,现有每次有两只猴子要决斗,如果认识,就不打了 ...

  6. 【bzoj1455】【罗马游戏】左偏树+并查集(模板)

    Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以鼻 ...

  7. 模板 可并堆【洛谷P3377】 【模板】左偏树(可并堆)

    P3377 [模板]左偏树(可并堆) 如题,一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或第y个数已经被删 ...

  8. 洛谷 P3377 模板左偏树

    题目:https://www.luogu.org/problemnew/show/P3377 左偏树的模板题: 加深了我对空 merge 的理解: 结构体的编号就是原序列的位置. 代码如下: #inc ...

  9. P3378 【模板】堆 (内含左偏树实现)

    P3378 [模板]堆 题解 其实就是一个小根堆啦,STL就可以解决,但是拥有闲情雅致的我学习了Jelly_Goat的左偏树,增加了代码长度,妙啊 Solution 1 STL STL 里面prior ...

  10. 洛谷P3377 【模板】左偏树(可并堆) 题解

    作者:zifeiy 标签:左偏树 这篇随笔需要你在之前掌握 堆 和 二叉树 的相关知识点. 堆支持在 \(O(\log n)\) 的时间内进行插入元素.查询最值和删除最值的操作.在这里,如果最值是最小 ...

随机推荐

  1. 百度网盘无vip高速下载的方法

    我拿的是谷歌浏览器做实验 首先下载一个可以改user-agent的插件 我chorm里面下载的是User-Agent Switcher for Chrome插件 将百度网盘的url地址中的baidu. ...

  2. win下删除EFI分区

    管理员身份,在cmd终端下,用"diskpart"命令. diskpart ##命令进入Microsoft DiskPart 模式 list disk ##展示磁盘分区列表 sel ...

  3. Abp的swagger UI 出现Failed to load API definition.

    Abp 出现Failed to load API definition.如下图: 原因:本次出现的原因是Api里面的方法重名了(只是方法的参数不一样)(可能是controller中的auction上面 ...

  4. 我的python笔记05

    Python 之路 Day5 - 常用模块学习 本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve ...

  5. gulp打包js多个文件夹并压缩混淆,编译ES6语法,及多个import依赖由一个入口打包成一个cdn

    感觉和webpack的步骤差不多 首先安装gulp:参考上一篇 安装完之后 新建一个文件目录起名 在当前目录下打开cmd 执行:npm init 创建package.json文件 然后安装第一个插件g ...

  6. LEF 格式

    LEF 文件是布局布线根据使用的cell 几何信息库的文件格式,下面是一个LEF文件的部分,右边是对他的解释.布局布线工具将根据LEF文件的信息决定怎样布局,怎么走线,怎样生成通孔. VERSION ...

  7. javascript当中prototype用法

    prototype见上一节,马克-to-win:prototype作用就是给某个类增加一个实例方法. 例 3.6.2 <head>    <meta http-equiv=" ...

  8. centos7 防火墙的操作

    参考文章:http://blog.csdn.net/Joe68227597/article/details/75207859 http://www.cnblogs.com/cocoat/p/66054 ...

  9. JUC-JUC是什么?

    一.JUC是什么? java.util.concurrent在并发编程中使用的工具类 进程/线程回顾 1.进程/线程是什么? 进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动.它是 ...

  10. Echart 地图实例

    1.地图实例 function func_InEchart() { require.config({ paths: { echarts: '../Scripts/echart2/echarts' }, ...