题目链接

https://www.luogu.com.cn/problem/P1456

题意

n只猴子有自己的力量值s,对于每个操作 x,y,在x和y猴子的猴群中分别选出力量最大的猴子,将力量值/2,之后将两个猴群合并。如果本来就在一个猴群,输出-1.

思路

类似并查集的联通属性和合并操作+维护块内最值以及修改=可并堆

思路很清晰,对于两个堆,弹出堆顶,处理值,重新合并回去,再合并两个堆就可以了。

每次merge用一些中间变量记录堆顶就可以了,但板子里的pop函数是没有返回堆顶的,这个要改一下。

代码

#include<cstdio>
#include<iostream>
#include<iomanip>
#include<map>
#include<unordered_map>
#include<string>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<chrono>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
#define int long long
//#define double long double
using namespace std;typedef long long ll;const int maxn=200005;const int inf=0x3f3f3f3f;const int mod=1e9+7;int n,m,k;struct custom_hash {static uint64_t splitmix64(uint64_t x) {x += 0x9e3779b97f4a7c15;x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;x = (x ^ (x >> 27)) * 0x94d049bb133111eb;return x ^ (x >> 31);}size_t operator()(uint64_t x) const {static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();return splitmix64(x + FIXED_RANDOM);}};struct left_tree{int dis,val;int fa,lson,rson;}lt[maxn];void init(){memset(lt,0,sizeof lt);lt[0].dis=-1;for(int i=0;i<maxn;i++)lt[i].fa=i;}inline int find(int x){return lt[x].fa==x?x:lt[x].fa=find(lt[x].fa);}int merge(int x,int y){if(!x||!y)  return x+y;if(lt[x].val>lt[y].val)   swap(x,y);//保证x<yint ls=lt[x].lson,rs=lt[x].rson;rs=merge(rs,y);if(lt[ls].dis<lt[rs].dis)   swap(ls,rs);lt[ls].fa=lt[rs].fa=lt[x].fa=x;lt[x].dis=lt[rs].dis+1;lt[x].lson=ls,lt[x].rson=rs;return x;}signed main(){IOS#ifndef ONLINE_JUDGEfreopen("IO\\in.txt","r",stdin);freopen("IO\\out.txt","w",stdout);#endifint tn=1;while(cin>>n){init();for(int i=1;i<=n;i++){cin>>lt[i].val;lt[i].val*=-1;}cin>>m;while(m--){int a,b;cin>>a>>b;a=find(a),b=find(b);if(a==b)    cout<<-1<<endl;else{int newl,newr,t;lt[a].val/=2;lt[lt[a].lson].fa=lt[lt[a].rson].fa=t=merge(lt[a].lson,lt[a].rson);lt[a].dis=lt[a].lson=lt[a].rson=0;lt[a].fa=lt[t].fa=newl=merge(a,t);lt[b].val/=2;lt[lt[b].lson].fa=lt[lt[b].rson].fa=t=merge(lt[b].lson,lt[b].rson);lt[b].dis=lt[b].lson=lt[b].rson=0;lt[b].fa=lt[t].fa=newr=merge(b,t);lt[newl].fa=lt[newr].fa=t=merge(newl,newr);cout<<-lt[t].val<<endl;}}}} 

P1456 Monkey King 左偏树模板题相关推荐

  1. hdu 1512 Monkey King 左偏树

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

  2. Monkey King - 左偏树

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

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

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

  4. HDU 1512 Monkey King(左偏堆)

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

  5. 【BZOJ1455】罗马游戏(左偏树)

    [BZOJ1455]罗马游戏(左偏树) 题面 BZOJ 然而权限题. 题解 左偏树模板题. #include<iostream> #include<cstdio> #inclu ...

  6. 【BZOJ】1455 罗马游戏 左偏树

    题目传送门 这题和洛谷上的左偏树模板的解题思路是一模一样的,所以只要贴上左偏树的模板就好了. 附上AC代码: #include <cstdio> #include <cctype&g ...

  7. 左偏树(可并堆)初步及其应用

    作者:hsez_yyh 链接:左偏树(可并堆)初步及其应用_hsez_yyh的博客-CSDN博客 来源:湖北省黄石二中信息竞赛组        著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

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

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

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

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

最新文章

  1. java javac javap 命令使用简介
  2. PAT甲级1006 Sign In and Sign Out:[C++题解]字符串处理
  3. udhcp源码详解(五) 之DHCP包--options字段
  4. 什么是抽象类?怎么定义?
  5. margin负值布局(一)
  6. Web高效管理多个项目的SVN仓库
  7. 8 -- 深入使用Spring -- 4...3 AOP的基本概念
  8. [elixir! #0023] 引擎盖下, `IO.puts` 如何运作
  9. P3194 [HNOI2008]水平可见直线
  10. 选择深度学习的GPU卡
  11. 计算机培训日志范文30篇,班主任工作日志20篇.docx
  12. ubuntu与windows双系统的启动项丢失
  13. python 穷举密码
  14. GoLang之Go中的map如何实现顺序读取
  15. OFDM载波间隔_5G NR的空口技术。为什么子载波间隔越大,符号长度越小?
  16. Springboot+mysql+大学生就业管理系统 毕业设计 -附源码290915
  17. PDF文本框更改字体大小
  18. 高性能计算(HPC)概述
  19. 静态代码分析工具清单:开源篇(各语言)
  20. DB2表空间操作详解

热门文章

  1. 关于String的intern的一个题目
  2. 20180117资金净流入排行榜
  3. List Set Map
  4. 免费GIF动图制作,简简单单一招搞定
  5. 达梦数据库的连接(四种方式-亲测可用)达梦数据库的几大小助手工具
  6. eslint plugins与extends的区别
  7. 应用程序正常初始化0xc0000135失败的解决办法
  8. 如何下载IEEE论文
  9. 主元素、主元素II、主元素III
  10. 由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题