题目:http://acm.hdu.edu.cn/showproblem.php?pid=1512

题意:有n个猴子,一开始每个猴子只认识自己。每个猴子有一个力量值,力量值越大表示这个猴子打架越厉害。然后给出两个数字,代表两只猴子有矛盾要决斗,如果2个猴子不认识,他们就会找他们认识的猴子中力量最大的出来单挑,单挑不论输赢,单挑的2个猴子力量值减半,这2拨猴子就都认识了。现在给m组询问,如果2只猴子相互认识,输出-1,否则他们各自找自己认识的最牛叉的猴子单挑,求挑完后这拨猴子力量最大值。

思路:学习左偏树。。。这篇很好左偏树的特点及其应用  ,维护每个猴子和他的朋友可以用并查集,然后维护他们之中最强的猴子则要用类似优先队列的数据结构,两拨猴子认识后就成了一拨,并查集要合并,维护战斗力的数据结构也要合并,用优先队列不能实现迅速合并,而左偏树就可以迅速的实现,因此用左偏树 + 并查集

#include <bits/stdc++.h>using namespace std;const int N = 100100;
struct node
{int l, r, d, val; //l,r是左右儿子,d维护左偏树距离void init(int _val){val = _val;l = r = d = 0;}
}tr[N];
int par[N], rnk[N];
void init(int n)
{for(int i = 1; i <= n; i++) par[i] = i;
}
int ser(int x)
{int r = x, i = x, j;while(r != par[r]) r = par[r];while(i != r) j = par[i], par[i] = r, i = j;return r;
}
void unite(int x, int y)
{x = ser(x), y = ser(y);if(x == y) return;par[x] = y;
}
int leftree_merge(int x, int y) //合并两个左偏树
{if(! x) return y; //有一个为空,则返回另一个if(! y) return x;if(tr[x].val < tr[y].val) swap(x, y);tr[x].r = leftree_merge(tr[x].r, y);par[tr[x].r] = x;if(tr[tr[x].l].d < tr[tr[x].r].d) swap(tr[x].l, tr[x].r); //距离大的作为左儿子,小的作为右儿子if(tr[x].r) tr[x].d = tr[tr[x].r].d + 1; //更新距离else tr[x].d = 0;return x;
}
int leftree_pop(int x)
{int ls = tr[x].l, rs = tr[x].r;par[ls] = ls, par[rs] = rs;tr[x].init(tr[x].val);return leftree_merge(ls, rs);
}
int del(int x) //这道题中每次弹出的必然是根节点,所以不会破坏左偏树性质,因此不用维护距离,于是leftree_pop和del函数作用相同
{int rx = par[x];int ls = tr[x].l, rs = tr[x].r;par[ls] = ls, par[rs] = rs;//tr[x].l = tr[x].r = tr[x].d = 0;tr[x].init(tr[x].val);int p = leftree_merge(ls, rs); //把待删除节点的两个儿子合并if(rx != x) //把新合并的点挂到待删除节点的父亲下面{if(tr[rx].l == x) tr[rx].l = p;if(tr[rx].r == x) tr[rx].r = p;}x = rx;while(x != par[x]) //删除一个点后可能会破坏左偏树性质,则从下至上更新距离{if(tr[tr[x].l].d < tr[tr[x].r].d) swap(tr[x].l, tr[x].r);if(tr[tr[x].r].d + 1 == tr[x].d) break;tr[x].d = tr[tr[x].r].d + 1;rx = par[x];}return p; //返回其左右儿子合并后的节点
}
int main()
{int n, m, val;while(~ scanf("%d", &n)){init(n);for(int i = 1; i <= n; i++){scanf("%d", &val);tr[i].init(val);}scanf("%d", &m);int v, u;for(int i = 1; i <= m; i++){scanf("%d%d", &v, &u);int rv = ser(v), ru = ser(u);if(rv == ru) puts("-1");else{int rrv = leftree_pop(rv);//int rrv = del(rv);tr[rv].val /= 2;rv = leftree_merge(rrv, rv);int rru = leftree_pop(ru);//int rru = del(ru);tr[ru].val /= 2;ru = leftree_merge(rru, ru);printf("%d\n", tr[leftree_merge(rv, ru)].val);}}}return 0;
}

HDU 1512 Monkey King 左偏树 + 并查集相关推荐

  1. hdu 1512 Monkey King 左偏树

    这题意思是一群一开始互不认识的猴子,可能会打架,打过一场就是朋友,一开始互不相识的猴子打架的时候,不一定自己动手,回去找自己朋友中战斗力最强的猴子,然后,两个打手打架,当然,如果自己最NB时,自己上, ...

  2. HDU 1512 Monkey King(左偏堆)

    爱争吵的猴子 ★★☆ 输入文件:monkeyk.in 输出文件:monkeyk.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 在一个森林里,住着N只好斗的猴子.开始,他们各 ...

  3. HDU 1512 Monkey King(左偏树+并查集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1512 题       意: 有n个猴子,一开始每个猴子只认识自己.每个猴子有一个力量值,力量值越大表示 ...

  4. Monkey King - 左偏树

    题目描述 Once in a forest, there lived N aggressive monkeys. At the beginning, they each does things in ...

  5. P1456 Monkey King 左偏树模板题

    题目链接 https://www.luogu.com.cn/problem/P1456 题意 n只猴子有自己的力量值s,对于每个操作 x,y,在x和y猴子的猴群中分别选出力量最大的猴子,将力量值/2, ...

  6. ZOJ 2334 HDU 1512 Monkey King

    题意: 猴子们打架  认识的猴子不会打架  两仅仅猴子打完以后就认识了  A认识B B认识C A也认识C  每次打架由两伙猴子进行  分别选出自己的最高战斗力  在战斗之后两仅仅猴子战斗力减半  给出 ...

  7. Monkey King(左偏树 可并堆)

    我们知道如果要我们给一个序列排序,按照某种大小顺序关系,我们很容易想到优先队列,的确很方便,但是优先队列也有解决不了的问题,当题目要求你把两个优先队列合并的时候,这就实现不了了 优先队列只有插入 删除 ...

  8. hdu 5575 Discover Water Tank 左偏树

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5575 题意: 现在有一个巨大的水库(可视为二维的),水库中间被 n−1n-1n−1 个挡板分成了 n ...

  9. HDU 5575 Discover Water Tank(左偏树)

    https://vjudge.net/problem/HDU-5575 题意: 有一个水箱,被n-1块板子分成了n个部分,板子的高度不尽相同.现在有m次探测,每次探测在第x部分的y+0.5高度处是否有 ...

最新文章

  1. YOLOv3模型剪枝,瘦身80%,提速100%,精度基本不变
  2. Spring的Bean的初始化
  3. Linux中断处理与定时器
  4. python实战项目书 题库系统_Python实战视频教程_基于Python项目与面试题实例讲解(进阶训练篇)...
  5. 后端返回页面ajax的处理
  6. Mac 如何查看电脑的蓝牙版本信息
  7. Flutter动画系列之AnimatedWidget
  8. Yii Framework2.0开发教程(10)配合mysql数据库实现用户登录
  9. BZOJ3091 城市旅行
  10. 商业计划书范文3000_项目融资商业计划书模板范文PPT
  11. java 爬虫处理数据_Java语言实现爬虫实战
  12. 【Python】基于Python的百度迁徙4——上班和休闲指数(附代码)
  13. postgresql fdw mysql_PostgreSQL使用MySQL外表(mysql_fdw)
  14. 神铺垫、神转折、神代入
  15. 海康威视 2020届实习+秋招面试 分享
  16. docker里面pytorch关于gloo地址声明
  17. 北大集训2020游记
  18. dev-C++五子棋
  19. Windows Server 2003 介绍
  20. 人工智能全球发展趋势、经济影响和未来挑战

热门文章

  1. 【Nginx】冰河又一本超硬核Nginx PDF教程免费开源!!
  2. 怎么把java源代码封装,如何把JAVA程序封装成EXE文件
  3. 使用SqlConnection.connectionString连接数据库
  4. java中switch的用法和逻辑运算符
  5. java使用Spire.Doc生成的word文件去除水印(头部的警告信息)
  6. Google Filament引擎编译记录
  7. libpng warning: iCCP: known incorrect sRGB profile 警告,问题解决
  8. Django开发常用30个软件包
  9. Android 设置锁屏时间,屏幕常亮效果
  10. CSS3选择器及其优先级