zoj2334 Monkey King , 并查集,可并堆,左偏树
提交地址:点击打开链接
题意: N(N<=10^5)仅仅猴子,初始每仅仅猴子为自己猴群的猴王。每仅仅猴子有一个初始的力量值。这些猴子会有M次会面。
每次两仅仅猴子x,y会面,若x,y属于同一个猴群输出-1,否则将x,y所在猴群的猴王的力量值减半,然后合并这两个猴群。
新猴群中力量值最高的为猴王。
输出新猴王的力量值。
分析:涉及集合的查询,合并,取最值。 利用并查集和左偏树就可以解决。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int maxn = 200000;
int tot, v[maxn], l[maxn], r[maxn], d[maxn], f[maxn];
int findset(int x)
{return f[x]==x?x:f[x]=findset(f[x]);}
int Merge(int x, int y)
{
if(!x) return y;
if(!y) return x;
if(v[x] < v[y]) swap(x, y); //大顶堆
r[x] = Merge(r[x], y); //递归合并右子树和Y
f[r[x]] = x; //更新T右子树的根
if(d[l[x]] < d[r[x]]) //维护堆性质
swap(l[x], r[x]);
d[x] = d[ r[x] ] + 1;
return x;
}
int Init(int x)
{
tot++;
v[tot] = x;
f[tot] = tot;
l[tot] = r[tot] = d[tot] = 0;
}
int Insert(int x, int y)
{
return Merge(x, Init(y));
}
int Top(int x)
{
return v[x];
}
int Pop(int x)
{
int L = l[x], R = r[x];
f[L] = L;
f[R] = R;
v[x] /= 2;
r[x] = l[x] = d[x] = 0;
return Merge(L, R);
}
void solve(int x, int y)
{
int left = Pop(x), right = Pop(y);
left = Merge(left, x);
right = Merge(right, y);
left = Merge(left, right);
printf("%d\n", Top(left));
}
int main()
{
int n, m, i, x, y;
while(~scanf("%d", &n))
{
tot = 0;
for(i=1; i<=n; ++i)
{
scanf("%d",&x);
Init(x);
}
scanf("%d", &m);
for(i=1; i<=m; ++i)
{
scanf("%d%d", &x, &y);
int fx = findset(x), fy = findset(y);
if(fx==fy)
{
printf("-1\n");
}
else
{
solve(fx, fy);
}
}
}
return 0;
}
/*
5
20
16
10
10
4
5
2 3
3 4 8
5
5
-1
10
*/
zoj2334 Monkey King , 并查集,可并堆,左偏树的更多相关文章
- ZOJ2334 Monkey King 并查集 STL
题意:两家原始人(猴)打交道后成为一家猴,打交道时两家分别派出最帅的两位猴子,颜值各自减半,问每次打交道后新家族最帅的猴子的颜值.当然,已经是一家子就没有必要打交道了,因为没有猴希望颜值降低,毕竟还得 ...
- 【BZOJ 1455】 1455: 罗马游戏 (可并堆-左偏树+并查集)
1455: 罗马游戏 Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那 ...
- 洛谷 - P1552 - 派遣 - 左偏树 - 并查集
首先把这个树建出来,然后每一次操作,只能选中一棵子树.对于树根,他的领导力水平是确定的,然后他更新答案的情况就是把他子树内薪水最少的若干个弄出来. 问题在于怎么知道一棵子树内薪水最少的若干个分别是谁. ...
- zoj 2334 Monkey King/左偏树+并查集
原题链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1389 大致题意:N只相互不认识的猴子(每只猴子有一个战斗力值) 两只 ...
- HDU 1512 Monkey King(左偏树+并查集)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=1512 [题目大意] 现在有 一群互不认识的猴子,每个猴子有一个能力值,每次选择两个猴子,挑出他们所 ...
- HDU 1512 Monkey King (左偏树+并查集)
题意:在一个森林里住着N(N<=10000)只猴子.在一开始,他们是互不认识的.但是随着时间的推移,猴子们少不了争斗,但那只会发生在互不认识 (认识具有传递性)的两只猴子之间.争斗时,两只猴子都 ...
- ZOJ2334 Monkey King 左偏树
ZOJ2334 用左偏树实现优先队列最大的好处就是两个队列合并可以在Logn时间内完成 用来维护优先队列森林非常好用. 左偏树代码的核心也是两棵树的合并! 代码有些细节需要注意. #include&l ...
- HDU1512 ZOJ2334 Monkey King 左偏树
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - ZOJ2334 题目传送门 - HDU1512 题意概括 在一个森林里住着N(N<=10000)只猴子. ...
- Monkey King(左偏树 可并堆)
我们知道如果要我们给一个序列排序,按照某种大小顺序关系,我们很容易想到优先队列,的确很方便,但是优先队列也有解决不了的问题,当题目要求你把两个优先队列合并的时候,这就实现不了了 优先队列只有插入 删除 ...
随机推荐
- Windows 10安装pip方法
pip是一款非常方便的python包管理工具,本文主要介绍在windows 10下安装pip方法. 1. 下载pip 地址:https://pypi.python.org/pypi/pip#downl ...
- jbox小型交互表单(ajax)
function updateval(id){ var url = '${ctx}/zbapp/ranking/zbappRankingList/form?id=${zbappRankingList. ...
- MIT-6.824 Lab 3: Fault-tolerant Key/Value Service
概述 lab2中实现了raft协议,本lab将在raft之上实现一个可容错的k/v存储服务,第一部分是实现一个不带日志压缩的版本,第二部分是实现日志压缩.时间原因我只完成了第一部分. 设计思路 如上图 ...
- C++ 大学课堂知识点总结
一.从C到C++1.引用int b;int &a = b;//a是引用类型 定义的时候加& 表示引用 其余都是取地址 a是b别名 使用a和使用b是一样的 主要用于 ...
- html (第四本书第八章参考)
上机1 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8 ...
- Android中加载事件的方式
Android中加载事件的方式 通过内部类的方式实现 通过外部类的方式实现 通过属性的方式实现 通过自身实现接口的方式实现 通过内部类的方式实现 Demo btn_Login.setOnClickLi ...
- 以OPC PowerTool 连接iFix与KEPWARE
1.安装完iFix后,再安装KEPWARE软件,然后必须再安装所需要的IO驱动才能进行device的通讯连接.这里安装iFix本身提供的OPC PowerTool V7.34a. 2.在安装完iFix ...
- codevs 水过 骑马修栅栏
[问题描述] 农民John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个一个栅栏.你必须编一个程序,读入栅 ...
- MikroTik RouterOS x86最大内存只能支持2G
这个和授权无关,所以多余的内存将不被使用,并且官方逐步放弃对x86的支持,转投硬件以及chr的支持.而且x86架构对于网卡驱动非常挑剔,一不小心购买的网卡是没有驱动的,只能买一些intel或者博通的高 ...
- spring cloud 学习(4) - hystrix 服务熔断处理
hystrix 是一个专用于服务熔断处理的开源项目,当依赖的服务方出现故障不可用时,hystrix有一个所谓的断路器,一但打开,就会直接拦截掉对故障服务的调用,从而防止故障进一步扩大(类似中电路中的跳 ...