题目链接

分析

左偏树的模板题,加上并查集之后还是很好理解的,没有什么思路可言就是合并和修改堆中的元素;
代码+注释

#include<bits/stdc++.h>
#define N 100005
using namespace std;
int n,x,y,k,h,m,cnt,fa[N],v[N],l[N],r[N],d[N];
int find(int x){return fa[x]==x ? x:fa[x]=find(fa[x]);}//模板并查集
int merge(int x,int y){if(!x || !y)return x+y;if(v[x]<v[y])swap(x,y);r[x]=merge(r[x],y);fa[r[x]]=x;if(d[l[x]]<d[r[x]])swap(l[x],r[x]);if(!r[x]) d[x]=0;else d[x]=d[r[x]]+1;return x;
}//合并堆,就基本操作
int del(int x){int left=l[x],right=r[x];//注意此处不可省略fa[left]=left;fa[right]=right;l[x]=r[x]=d[x]=0;return merge(left,right);//否则此处会出现问题,想一想为什么
}//删除节点
void work(int x,int y){v[x]/=2,v[y]/=2;int left,right;left=del(x);right=del(y);//删除原来的节点left=merge(x,left);right=merge(y,right);//跟新新的节点int h=merge(left,right);//合并printf("%d\n",v[h]);//输出
}
int main(){while(~scanf("%d",&n)){for(int i=1;i<=n;i++){fa[i]=i;l[i]=r[i]=d[i]=0;scanf("%d",&v[i]);}//有多组数据所以需要初始化scanf("%d",&m); for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);int fx=find(x),fy=find(y);//并查集查找父亲节点if(fx==fy){printf("-1\n");continue;}work(fx,fy);}}return 0;
}

心得

对于此类题目需要细心细心再细心,数据结构不能错,一错就调三百年QwQ;

luoguP1456 Monkey King相关推荐

  1. LuoguP1456 - Monkey King| 左倾堆 | 左偏树

    洛谷P1456 有n只猴子,每只猴子的战斗力为ai.m次操作,每次操作过后,猴子认识的猴子中(包括自己)战斗力最大的战斗力减半.操作后,两只猴子从不认识变为认识.输出打完架之后猴子认识的猴子中的最大战 ...

  2. 有趣的排序算法——Monkey King排序 详细介绍

    <关于某位小蒟蒻在机房划水没事干于是瞎搞的那档事> 前言 排序算法在题目中经常需要用到,在程序中,我们一般打的是快排,归并,堆排等高效率排序,更有甚者会直接用sort排序,而今天,我要介绍 ...

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

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

  4. 洛谷1456 Monkey King

    题目:Monkey King 思路:左偏树.对于每次操作 x y ,先让x,y等于各自朋友中最大的那个,即x=find(x),y=find(y),然后再分别把x,y删除,修改权值后重新加入堆中. 代码 ...

  5. 洛谷P1456 Monkey King

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

  6. Monkey King

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

  7. 【洛谷】P1456 Monkey King

    题目地址: https://www.luogu.com.cn/problem/P1456 题面翻译: 题目描述: 曾经在一个森林中居住着NNN只好斗的猴子.在最初他们我行我素,互不认识.但是猴子们不能 ...

  8. Monkey King - 左偏树

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

  9. 洛谷 P1456 Monkey King 题解

    标签:左偏树&并查集 思路来源: Q1:为什么用并查集? A1:因为要判断两队猴子是否认识,在此处使用并查集可以便于维护两队猴子间的关系. Q2:为什么用堆? A2:因为每次对战都需要查找当前 ...

最新文章

  1. PHP设计模式之组合模式(Composite Pattern)
  2. JavaScript 教程(二)
  3. 083_JavaScript Cookies
  4. 原创:Spring整合junit测试框架(简易教程 基于myeclipse,不需要麻烦的导包)
  5. 罗永浩称赚钱没有太大难度,是凡尔赛还是感慨?
  6. Python 中的全局变量
  7. 使用markdown写大论文
  8. 小试牛刀——搭建一个周报管理系统
  9. winform自定义日历控件
  10. 右耳Python小作业--快递分拣
  11. 5月6号基金分析的那篇文章,时隔两个月收益如何?
  12. Qt读写Excel--QXlsx设置字体格式、样式8
  13. 微信小程序被投诉怎么办?小妙招教给你
  14. 基于CAN的网络管理
  15. 【知识兔】Excel教程之隔行/隔列求和
  16. Shi-tomasi角点检测python实现及基于opencv实现 (角点检测、非极大值抑制)
  17. 为Windows右键新建菜单添加菜单项
  18. linux命令详解--pmap
  19. 《第六周RFID作业》物联112118 林家辉
  20. 奥地利研究发现老夫择少妻是进化需要

热门文章

  1. PreTranslateMessage使用
  2. mysql字符集mysqldump_Mysqldump 字符集问题
  3. 【概念】权限管理模型(RBAC、ABAC、ACL)
  4. [1.24] T3-人品问题
  5. /dev/sdxx is apparently in use by the system; will not make a filesystem here! 解决方法
  6. DM与ML的主要区别
  7. 【自考】——考后总结
  8. Android反模拟器的总结
  9. Java播放声音文件
  10. JavaScript中的let声明