「HDU 1512」Monkey King
时间:2020-01-18
本文章向大家介绍「HDU 1512」Monkey King,主要包括「HDU 1512」Monkey King使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
曾经在森林里,有 N 只好斗的猴子。一开始,他们各自以自己的方式做事,彼此之间都不认识。但是猴子无法避免争吵,争吵只发生在两只彼此不认识的猴子之间。当发生这种情况时,两只猴子都将邀请他们中最坚强的朋友并进行决斗。当然,在决斗之后,两只猴子和那里所有的朋友彼此认识,即使这些猴子曾经发生过冲突,上面的争吵也不会再发生。
假设每只猴子都有一个强力值,在决斗后,该值将只减少为原始值的一半(即 10 减少为 5 , 5 减少为 2 )。
我们还假设每只猴子都认识自己。也就是说,当他是所有朋友中最坚强的人时,他本人将进行决斗。
分析
给每个猴子建一棵大根堆左偏树,当两个猴子成为朋友的时候,就把它们所在的左偏树合并,而找出最坚强的朋友,就返回它所在的左偏树的堆顶。减少朋友的强力值的话,先删除朋友,将权值减半再将该点作为一棵左偏树合并进原来的左偏树中就好了。
代码
//=========================
// author:hliwen
// date:2020.1.18
//=========================
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 100005
#define il inline
#define re register
#define DEBUG puts("ok")
#define tie0 cin.tie(0),cout.tie(0)
#define fastio ios::sync_with_stdio(false)
#define File(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout)
using namespace std;
typedef long long ll;
template <typename T> inline void read(T &x) {
T f = 1; x = 0; char c;
for (c = getchar(); !isdigit(c); c = getchar()) if (c == '-') f = -1;
for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
x *= f;
}
int n, m;
int val[N], fa[N], dis[N], rs[N], ls[N];
int merge(int x, int y) {
if (!x || !y) return x + y;
if (val[x] < val[y]) swap(x, y);
rs[x] = merge(rs[x], y);
fa[rs[x]] = x;
if (dis[ls[x]] < dis[rs[x]]) swap(ls[x], rs[x]);
dis[x] = dis[rs[x]] + 1;
return x;
}
int pop(int x) {
val[x] >>= 1;
int y = fa[ls[x]] = fa[rs[x]] = merge(ls[x], rs[x]);
ls[x] = rs[x] = 0;
return fa[x] = fa[y] = merge(x, y);
}
int find(int x) {
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
int main() {
int x, y, ans;
while (~scanf("%d", &n)) {
for (int i = 1; i <= n; ++i) {
read(val[i]);
fa[i] = i;
dis[i] = rs[i] = ls[i] = 0;
}
read(m);
for (int i = 1; i <= m; ++i) {
read(x), read(y);
if (find(x) == find(y)) puts("-1");
else {
int fx = find(x), fy = find(y);
ans = merge(pop(fx), pop(fy));
printf("%d\n", val[ans]);
}
}
}
return 0;
}
原文地址:https://www.cnblogs.com/hlw1/p/12209579.html
- 图的基本算法(BFS和DFS)
- C++STL中set的使用策略(详解)
- Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2)(A.思维题,B.思维题)
- 设计模式六大原则(1):单一职责原则
- 设计模式六大原则(2):里氏替换原则
- Selenium2+python自动化72-logging日志使用
- Codeforces Round #395 (Div. 2)(A.思维,B,水)
- php实现图形计算器
- Selenium2+python自动化73-定位的坑:class属性有空格
- 华中农业大学第五届程序设计大赛网络同步赛题解
- Java构造方法与析构方法实例剖析
- 5.训练模型之利用训练的模型识别物体
- KMP算法学习(详解)
- 查找算法的实现(C/C++实现)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [OHIF-Viewers]医疗数字阅片-医学影像-redux-token实操(1)
- [OHIF-Viewers]医疗数字阅片-医学影像-屏蔽StudyList病例列表
- Ant Design for Vue的Table组件一列显示多个参数
- 【React】React-router的使用记录
- Blazor带我重玩前端(四)
- Android绘制系统简介
- E: Sub-process /usr/bin/dpkg returned an error code (1) 解决方案
- Linux 如何使用包管理器安装 Node.js
- CSS画图
- R语言聚类算法的应用实例
- Python时间序列选择波动率预测指数收益算法分析案例
- Linux 常用系统工作命令-date
- R使用LASSO回归预测股票收益
- Linux 常用系统工作命令-reboot、poweroff、wget
- Node.js + Socket.io 实现一对一即时聊天