HDU 1512 左偏树+并查集
思路:
左偏树里面掺了一些并查集的应用
这里放一份左偏树的代码模板
重点就是merge函数了……
int merge(int k1,int k2){
if(!k1||!k2)return k1+k2;
if(tr[k1].w<tr[k2].w)swap(k1,k2);
tr[k1].r=merge(tr[k1].r,k2);
if(tr[tr[k1].l].dis<tr[tr[k1].r].dis)swap(tr[k1].l,tr[k1].r);
tr[k1].dis=tr[tr[k1].r].dis+1;
return k1;
}
插入:合并原树和新节点。
删除最小值:合并左右子树。
删在某个地方的值:打个标记 以后用的时候再忽略
在这道题中 删的时候 找到左右子树 并查集变成它自己 再合并
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 100050
int n,m,root[N],xx,yy,f[N];
struct Tree{int l,r,w,dis;void init(){l=r=dis=0;}}tr[N];
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
int merge(int k1,int k2){
if(!k1||!k2)return k1+k2;
if(tr[k1].w<tr[k2].w)swap(k1,k2);
tr[k1].r=merge(tr[k1].r,k2);
f[tr[k1].r]=k1;
if(tr[tr[k1].l].dis<tr[tr[k1].r].dis)swap(tr[k1].l,tr[k1].r);
tr[k1].dis=tr[tr[k1].r].dis+1;
return k1;
}
int pop(int x){
tr[x].w/=2;
int l=tr[x].l,r=tr[x].r;
f[l]=l,f[r]=r;
tr[x].init();
int t=merge(l,r);
return merge(x,t);
}
int main(){
while(~scanf("%d",&n)){
for(int i=1;i<=n;i++){
scanf("%d",&tr[i].w);
tr[i].init(),f[i]=i;
}
scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%d%d",&xx,&yy);
int fx=find(xx),fy=find(yy);
if(fx==fy)puts("-1");
else{
int tx=pop(fx),ty=pop(fy);
printf("%d\n",tr[merge(tx,ty)].w);
}
}
}
}
HDU 1512 左偏树+并查集的更多相关文章
- 洛谷 - P1552 - 派遣 - 左偏树 - 并查集
首先把这个树建出来,然后每一次操作,只能选中一棵子树.对于树根,他的领导力水平是确定的,然后他更新答案的情况就是把他子树内薪水最少的若干个弄出来. 问题在于怎么知道一棵子树内薪水最少的若干个分别是谁. ...
- 洛谷 - P3377 - 【模板】左偏树(可并堆) - 左偏树 - 并查集
https://www.luogu.org/problemnew/show/P3377 左偏树+并查集 左偏树维护两个可合并的堆,并查集维护两个堆元素合并后可以找到正确的树根. 关键点在于删除一个堆的 ...
- HDU 1512 Monkey King(左偏树+并查集)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=1512 [题目大意] 现在有 一群互不认识的猴子,每个猴子有一个能力值,每次选择两个猴子,挑出他们所 ...
- HDU 1512 Monkey King (左偏树+并查集)
题意:在一个森林里住着N(N<=10000)只猴子.在一开始,他们是互不认识的.但是随着时间的推移,猴子们少不了争斗,但那只会发生在互不认识 (认识具有传递性)的两只猴子之间.争斗时,两只猴子都 ...
- zoj 2334 Monkey King/左偏树+并查集
原题链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1389 大致题意:N只相互不认识的猴子(每只猴子有一个战斗力值) 两只 ...
- 【BZOJ 1455】 1455: 罗马游戏 (可并堆-左偏树+并查集)
1455: 罗马游戏 Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那 ...
- 【bzoj1455】【罗马游戏】左偏树+并查集(模板)
Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以鼻 ...
- bzoj 1455: 罗马游戏 左偏树+并查集
1455: 罗马游戏 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 668 Solved: 247[Submit][Status] Descriptio ...
- hdu1512 Monkey King(左偏树 + 并查集)
Once in a forest, there lived N aggressive monkeys. At the beginning, they each does things in its o ...
随机推荐
- BZOJ 3689 异或之 (可持久化01Trie+堆)
题目大意:给你一个序列,求出第$K$大的两两异或值 先建出来可持久化$01Trie$ 用一个$set$/堆存结构体,存某个异或对$<i,j>$的第二关键字$j$,以及$ai\;xor\;a ...
- ASP.NET-文件上传代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...
- 数学之路-python计算实战(6)-numpy-ndarray
>>>> mya=np.zeros(shape=(2,2)) >>>> mya array([[ 0., 0.], [ 0., 0.]]) > ...
- Node.js 博客实例(十)pv统计和留言统计
原教程 https://github.com/nswbmw/N-blog/wiki/_pages的第十章,因为版本号等的原因,在原教程基础上稍加修改就可以实现. post.js中将var post={ ...
- STL源代码学习(vector篇)
#include <concept_checks.h> #include<stl_allocate.h> /// The vector base class's constru ...
- Appium - Android 对照 iOS
Appium - Android 对照 iOS 作者: Max.Bai 时间: 2014/10 Appium - Android 对照 iOS Appium 支持Android也支持iOS.可是两者还 ...
- vs2012碰到生成时报该错误:项目中不存在目标 “XXXXXX”
vs2012碰到生成时报该错误:项目中不存在目标 "XXXXXX" 首先打开project文件,找到 以下信息: <Import Project="$(MSBuil ...
- Android微信智能心跳方案 Android微信智能心跳方案
原文地址: http://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=207243549&idx=1&sn=4ebe4beb81 ...
- Android jni 二维数组 传递
学习Android Jni时,一个二维 整数 数组的传递花了我好长时间,在网上查的资料都不全,当然最后是成功了,写在这里是为了自己记住,当然有人搜索到并利用了我会很高兴. in Android J ...
- Mysql优化理论知识
参考文章 http://blog.51cto.com/lizhenliang/2095526 ()硬件优化 如果有条件一定要SSD固态硬盘代替SAS机械硬盘,将RAID级别调整为RAID1+,相对于R ...