左偏树(p1456) 比较模板的一道题
题意:有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) 比较模板的一道题的更多相关文章
- 左偏树 P3377【模板】左偏树(可并堆)
题目传送门 代码: /* code by: zstu wxk time: 2019/03/01 */ #include<bits/stdc++.h> using namespace std ...
- 左偏树(p4431)
难得不是左偏树,而是思维: 这道题在做得时候,有两个性质 1.如果a是一个不下降序列,那么b[i]==a[i]时取得最优解. 2.如果a是一个严格递减序列,则取a序列的中位数x,令b[1]=b[2]= ...
- 洛谷 P3377 【模板】左偏树(可并堆)
洛谷 P3377 [模板]左偏树(可并堆) 题目描述 如题,一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或 ...
- [Luogu3377]【模板】左偏树(可并堆)
题面戳我 题目描述 如题,一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或第y个数已经被删除或第x和第y个数 ...
- HDU 1512 Monkey King(左偏树模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=1512 题意: 有n只猴子,每只猴子一开始有个力量值,并且互相不认识,现有每次有两只猴子要决斗,如果认识,就不打了 ...
- 【bzoj1455】【罗马游戏】左偏树+并查集(模板)
Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以鼻 ...
- 模板 可并堆【洛谷P3377】 【模板】左偏树(可并堆)
P3377 [模板]左偏树(可并堆) 如题,一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或第y个数已经被删 ...
- 洛谷 P3377 模板左偏树
题目:https://www.luogu.org/problemnew/show/P3377 左偏树的模板题: 加深了我对空 merge 的理解: 结构体的编号就是原序列的位置. 代码如下: #inc ...
- P3378 【模板】堆 (内含左偏树实现)
P3378 [模板]堆 题解 其实就是一个小根堆啦,STL就可以解决,但是拥有闲情雅致的我学习了Jelly_Goat的左偏树,增加了代码长度,妙啊 Solution 1 STL STL 里面prior ...
- 洛谷P3377 【模板】左偏树(可并堆) 题解
作者:zifeiy 标签:左偏树 这篇随笔需要你在之前掌握 堆 和 二叉树 的相关知识点. 堆支持在 \(O(\log n)\) 的时间内进行插入元素.查询最值和删除最值的操作.在这里,如果最值是最小 ...
随机推荐
- 如何将.sql文件导入到mysql的数据库中
首先通过cmd的net start mysql57 启动mysql的服务器 然后,输入命令:mysql -h 127.0.0.1 -u root -p来启动mysql服务 最后 上图画红圈的部分是.s ...
- 【安卓开发】Webview简单使用
什么是WebView? 答:Android内置webkit内核的高性能浏览器,而WebView则是在这个基础上进行封装后的一个 控件,WebView直译网页视图,我们可以简单的看作一个可以嵌套到界面上 ...
- Wannafly Camp 2020 Day 6K 最大权值排列
按照样例那样排列即可 #include <bits/stdc++.h> using namespace std; int main() { int n; cin>>n; if( ...
- arm学习笔记
学习ARM也有一定时间了,想想还是记点东西,要不以后就忘了.这是我的第一片,简简单单.但比较基础.1. ARM中一些常见英文缩写解释MSB:最高有效位:LSB:最低有效位:AHB:先进的高性能总线:V ...
- python之路递归、冒泡算法、装饰器
map使用 完整用户名登录,注册 冒泡排序 递归 def func(arg1,arg2): if arg1 == 0: print arg1, arg2 arg3 = arg1 + arg2 prin ...
- Go变量与常量
变量与常量 变量声明 定义变量时指定变量类型式 定义变量时依靠类型推断 go是静态,强类型语言(java,c++也是如此). 静态语言: 在编译时就能确定变量类型的语言,类型推导在编译阶段可以不用指明 ...
- PHP 中 16 个魔术方法详解
PHP 中 16 个魔术方法详解 前言 PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用. 魔术方法包括: __constru ...
- Django | mysql修改个别表后save()报错
报错内容: elasticsearch.exceptions.ConnectionError: ConnectionError(<urllib3.connection.HTTPConnectio ...
- TP5和TP3.2的使用区别
模板标签不一样: TP5 可在配置文件中自行定义自己喜欢的标签 TP5 使用双标签 如:{foreach} {/foreach} TP3 : <> TP5 :{} 调用数据表方式: M( ...
- d2admin框架学习
<template slot-scope="scope"> <el-button @click="upper_score(scope.$index, s ...