HDU 1512 Monkey King 可并堆,左偏树

示波器实测RGMII信号:从125MHz时钟判断千兆模式,到时序抓取与PHY寄存器避坑 本文详细介绍了使用示波器实测RGMII信号的完整流程,包括125MHz时钟频率判断、时序参数测量及PHY寄存器配置避坑指南。通过实战操作和典型故障案例分析,帮助硬件工程师快速定位和解决千兆以太网接口的调试问题,提升通信稳定性。 阅读详情

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1512
题意: 有n个猴子,一开始每个猴子只认识自己。每个猴子有一个力量值,力量值越大表示这个猴子打架越厉害。如果2个猴子不认识,他们就会找他们认识的猴子中力量最大的出来单挑,单挑不论输赢,单挑的2个猴子力量值减半,这2拨猴子就都认识了,不打不相识嘛。现在给m组询问,如果2只猴子相互认识,输出-1,否则他们各自找自己认识的最牛叉的猴子单挑,求挑完后这拨猴子力量最大值。
解题方法:首先很明显这题涉及到集合并的操作,要用到并查集。其次要找到某一拨猴子中力量最大值,找最大值最快的应该是堆。2拨猴子要快速合并而又不失堆的特性,想来想去左偏树比较合适。下面来说说左偏树:
这里写图片描述

然后左偏树有几个很重要的性质如下:

[性质1] 节点的键值小于或等于它的左右子节点的键值。

[性质2] 节点的左子节点的距离不小于右子节点的距离。

[性质3] 节点的左子节点右子节点也是一颗左偏树。

左偏树支持,插入,删除,去最小节点,以及最重要的合并操作,并且保证这些操作的复杂度为严格的log(n)。

下面给出合并操作的核心代码:

int merge(int a, int b) //合并
{
    if(a == 0) return b;
    if(b == 0) return a;
    if(heap[a].v < heap[b].v) swap(a, b);
    heap[a].r = merge(heap[a].r, b);
    heap[heap[a].r].f = a;
    if(heap[heap[a].l].dis < heap[heap[a].r].dis) swap(heap[a].l, heap[a].r);
    if(heap[a].r == 0) heap[a].dis = 0;
    else heap[a].dis = heap[heap[a].r].dis + 1;
    return a;
}

然后给出本题的完整代码,第一次写可并堆,代码是参考了别人写的。

//hdoj 1512 可并堆
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
struct tree{int l, r, v, dis, f;}heap[maxn]; //左儿子,右儿子,权值, 距离,父亲节点
int merge(int a, int b) //合并
{
    if(a == 0) return b;
    if(b == 0) return a;
    if(heap[a].v < heap[b].v) swap(a, b);
    heap[a].r = merge(heap[a].r, b);
    heap[heap[a].r].f = a;
    if(heap[heap[a].l].dis < heap[heap[a].r].dis) swap(heap[a].l, heap[a].r);
    if(heap[a].r == 0) heap[a].dis = 0;
    else heap[a].dis = heap[heap[a].r].dis + 1;
    return a;
}
int pop(int a){ //删除
    int l = heap[a].l, r = heap[a].r;
    heap[l].f = l, heap[r].f = r;
    heap[a].l = heap[a].r = heap[a].dis = 0;
    return merge(l, r);
}
int find(int a){ //查找
    return heap[a].f == a ? a : find(heap[a].f);
}

int main(){
    int n, m;
    while(scanf("%d", &n) != EOF)
    {
        for(int i = 1; i <= n; i++){
            scanf("%d", &heap[i].v);
            heap[i].l = heap[i].r = heap[i].dis = 0;
            heap[i].f = i;
        }
        scanf("%d", &m);
        for(int i = 1; i <= m; i++){
            int a, b, fa, fb;
            scanf("%d%d", &a, &b);
            fa = find(a), fb = find(b);
            if(fa == fb){
                printf("-1\n");
            }
            else{
                heap[fa].v /= 2;
                int u = pop(fa);
                u = merge(u, fa);
                heap[fb].v /= 2;
                int v = pop(fb);
                v = merge(v, fb);
                printf("%d\n", heap[merge(u, v)].v);
            }
        }
    }
    return 0;
}
狂神说docker(最全笔记) 一.Docker入门 1. Docker 为什么会出现 2. Docker的历史 3.Docker最新超详细版教程通俗易懂 Docker是基于Go语言开发的!开源项目 官网 官方文档Docker文档是超详细的 仓库地址 4. 虚拟化技术和容器化技术对比 4.1. 虚拟化技术的缺点 资源占用十分多 冗余步骤多 启动很慢 2.2. 容器化技术 比较Docker和虚拟化技术的不同 传统虚拟机, 虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软. 阅读详情

相关推荐

Fluent VOF造波从入门到放弃?手把手教你用k-w SST模型搞定波浪模拟

本文详细介绍了使用Fluent VOF和k-w SST模型进行波浪模拟的实战技巧,从参数设置到结果优化,帮助用户避开常见误区。通过工业项目验证的配置方案,提升波浪模拟的准确性和计算效率,特别适合处理多相流和复杂湍流场景。

weixin_27102543的博客 422

数据结构专题-学习笔记:可并堆 - 左偏树

左偏树学习笔记。

Plozia 的小窝 480

[Spawn service failed. Exiting] ROS2运行turtlebot3_gazebo例程卡住_报错

[Spawn service failed. Exiting] ROS2运行turtlebot3_gazebo例程卡住_报错

Feizhai2的博客 4862

可并堆(左偏树)

前置废话 &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp;可并堆,顾名思义,就是一些可以合并的堆。 &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp; &amp;amp;amp;nbsp;左偏树,顾名思义,就是向左偏的树。 &amp;amp;amp;nbsp; &amp

a_forever_dream的博客 610

芯片设计新思路:如何用SystemC+TLM2.0快速搭建ESL性能模型(附GEM5实战案例)

本文探讨了在芯片设计早期利用SystemC和TLM2.0标准快速构建电子系统级(ESL)性能模型的方法。通过对比不同抽象层次,详细介绍了如何搭建事务级模型,并与GEM5仿真平台协同,实现高效的架构探索和性能评估。文章最后通过一个片上网络(NoC)带宽优化的实战案例,展示了该方法如何驱动数据驱动的设计决策,从而在流片前规避风险、优化芯片性能。

fire9的博客 369

NeurIPS‘25新研究!PINN+GNN强强联手,模型精度飙升50%!

物理图神经网络研究取得重大进展!UCLA团队提出的PhysGNN架构在NeurIPS'2025上引发关注,该模型成功融合PINN的物理约束优势与GNN的图结构处理能力,解决了工程仿真中的关键瓶颈。研究显示,PhysGNN在城市热网预测中误差降低42%,电网负荷模拟的物理规则违反率下降68%。同步解析的SyncTREE模型则创新性地将RC树物理特性融入GNN,实现毫秒级IC时序分析;HSPGNN模型通过嵌入偏微分方程,显著提升多变量时间序列填补精度。

m0_73122726的博客 1021

可并堆的实现

我要写三种可并堆,然后讲解它们. 1. 二项堆2. 配对堆3. RP堆 这三种堆都有一个共同特点,就是用一棵半满的树表示子堆,用一系列子堆表示整个堆(当然子堆是有限制的).那么我们可以很方便的进行合并两个堆等操作. 1.二项堆 这三种堆里最简单的就是二项堆了(Binomial Heap).为什么称为二项堆呢?二项堆这个小婊杂特别有趣,它的每个子堆大小都为2的幂.因此,它每次合并两个大小相等...

weixin_30826095的博客 308

RTAB-MAP实战:用Realsense D435i在ROS中搭建室内3D地图(附避坑指南)

本文详细介绍了如何在ROS环境下,使用Intel Realsense D435i深度相机和RTAB-MAP算法进行室内3D地图构建的完整实战流程。内容涵盖环境配置、核心节点数据流解析、关键参数调优、地图保存与重定位,并提供了实用的避坑指南,帮助机器人开发者和研究者快速实现稳定的视觉SLAM应用。

weixin_29095049的博客 490

可并堆

可并堆 可并堆,又称为左偏树,满足从一个节点一直向左儿子走比一直向右儿子走距离更长。 这样,它就满足了往右走最多log次,也就是每次合并的时间复杂度为O(log) 合并:将一个合并到另一个的右儿子上,合并的同时满足堆的所有性质。 BZOJ1455罗马游戏: 维护小根堆,每次合并的时候讲大的合并到小的的右儿子上。 可并堆例题,没有什么多说的,权值线段树合并应该也可以做。 附上代码: ...

weixin_34352005的博客 190

数字孪生成熟度的L0-L4五级划分,各自特征和应用场景

数字孪生的分级(或成熟度模型)通常用于描述其技术复杂度和功能完备性的演进过程。3D设计模型(CAD)、建筑信息模型(BIM)、产品数字化手册。全自动驾驶系统、自适应智能电网、 “黑灯工厂”的自主调度。多学科模型融合、 “What-if”分析、提供决策建议。IoT设备监控平台、预测性维护(报警)、智慧仪表盘。工艺仿真优化、资产性能管理、手术方案预演、虚拟调试。状态监控、历史回溯、阈值报警、根因分析。可视化、数字化档案。自优化、自适应、目标驱动、高度自治。传统设备、纸质记录的管理模式。无或仅有离线、孤立数据。

2401_82881178的博客 1553

从零开始:如何用STM32和MAX30100打造你的第一台智能心率监测设备

本文详细介绍了如何使用STM32微控制器和MAX30100传感器从零开始构建智能心率监测设备。涵盖硬件选择、电路设计、软件开发到心率算法实现的全过程,特别适合嵌入式开发新手和创客。通过OLED显示和蓝牙串口传输数据,打造低成本、高精度的心率检测仪,为健康监测项目提供实用解决方案。

7z8x2c4v6b9的博客 191

左偏树——可并堆

这一周的任务就是熟悉一下这种算法 看了一下学姐的blog,感觉还是有一定必要了解一下这种算法的: 论文链接 实际上论文已经很详细了,但是还是在这里废话一下(介绍一点简单的内容) 引入 可并堆,顾名思义就是可以合并的堆 我们一般概念上的堆就是一种优先队列 可是如果要求把两个堆合并,要怎么办呢? 这时我们就需要一种新的数据结构: 可并堆(Mergeable Heap) ...

Coco_T的博客 593

使用Python的OpenCV库进行三维重建点云

通过这些步骤,我们可以使用Python的OpenCV库进行三维重建,并生成对应的点云。当然,这只是一个简单的示例,实际的三维重建可能涉及更多的图像处理和计算步骤。在计算机视觉领域,三维重建是一项重要的任务,它可以将多个二维图像或视频序列转换为三维场景模型。在本文中,我们将介绍如何使用Python的OpenCV库进行三维重建,并生成相应的点云。以上是使用Python的OpenCV库进行三维重建点云的简要介绍和示例代码。最后,我们可以将计算得到的三维点云可视化。安装完成后,我们可以开始编写代码。

AuSwift的博客 1646

hdu 1512 Monkey King (左偏树 可并堆)

hdu 1512 Monkey King (左偏树 实现 可并堆) //#pragma comment(linker, "/STACK:1024000000,1024000000") #include #include #include #include #include #include #include #include #include #include #includ

冰 1073

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

hdu 1512 Monkey King (左偏树可并堆 并查集)

Monkey KingTime Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6170 Accepted Submission(s): 2628Problem Description Once in a forest, there li

w4149 458

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

hdu 1512 Monkey King 左偏树(可并堆)

Monkey KingTime Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6163 Accepted Submission(s): 2626Problem Description Once in a forest, there li

ywq12138的博客 367

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

左偏树+并查集 hdu1512 Monkey King

传送门:点击打开链接 题意:很多只猴子,每个猴子有个强壮值,一开始每只猴子都不认识。会有m次冲突,每次冲突的两只猴子如果不认识,就会各自在认识的人中各找一个最强壮的人打架,打完后打赢的那个人的强壮值会减半,并输出减半后的值,然后猴子两边的人都会互相认识成为朋友(所谓不打不相识..),如果两只猴子冲突但是已经认识了,那么就输出-1 思路:左偏树上次翻论文无意中发现的,感觉这种数据结构好66666

qwb的博客 999

【左偏树+并查集】Monkey King HDU1512

Monkey King Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2320    Accepted Submission(s): 975 Problem Description Once in a forest,

Jiangzh_MZOI 725

HDOJ 1512 Monkey King -- 左偏树

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1512 分析:左偏树应用。由于要

randygx的专栏 620

HDU 1512 Monkey King 左偏树 + 并查集

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1512 题意:有n个猴子,一开始每个猴子只认识自己。每个猴子有一个力量值,力量值越大表示这个猴子打架越厉害。然后给出两个数字,代表两只猴子有矛盾要决斗,如果2个猴子不认识,他们就会找他们认识的猴子中力量最大的出来单挑,单挑不论输赢,单挑的2个猴子力量值减半,这2拨猴子就都认识了。现在给m组询问,如果2

弱智就要多努力 815

hdu-1512 Monkey King [并查集+左偏树]

左偏树学习:点击打开链接 题意: 有N只猴子, 每只都有一个力量值. 开始的时候互不认识, 它们之间会发生M次斗争. 每次发生a, b的斗争时,a, b都会从各自的朋友圈里拉出一个最强的, 之后两只猴子打, 打完后这两只猴子的力量值各减半. 并且打完后,两只猴子的朋友圈的所有人都互相认识(也就是不会再打).你的任务就是对于每个斗争, 若a, b是朋友, 那么输出-1, 否则输出打完后它们的朋友

a915800048的专栏 699

hdu1512 monkey king 左偏树

题目大意:有n个猴子,一开始每个猴子只认识自己。每个猴子有一个力量值,力量值越大表示这个猴子打架越厉害。如果2个猴子不认识,他们就会找他们认识的猴子中力量最大的出来单挑,单挑不论输赢,单挑的2个猴子力量值减半,这2拨猴子就都认识了。现在给m组询问,如果2只猴子相互认识,输出-1,否则他们各自找自己认识的最牛叉的猴子单挑,求挑完后这拨猴子力量最大值。 就是一个并查集加左偏树。(左偏树这合并号强大

Merc_A的专栏 769

可并堆 - Monkey King(HDU1512)

传送门 Analysis 我都忘了自己学过左偏树了【呜呜呜呜】 就当模板复习吧 合并操作 int merge(int x,int y){ if(!x||!y) return x+y; if(tree[x].val<tree[y].val) swap(x,y);//这里处理的是大根堆 tree[x].rc=merge(tree[x].rc,y); fa[tree[x].rc]=x;/...

Faithfully-xly的博客 195

hdu1512 & zoj2334Monkey King(左偏树 + 并查集)

Monkey King Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2543    Accepted Submission(s): 1064 Problem Description Once in a for

ophunter的专栏 1775

HDU 1512 Monkey King(左偏树)

题目链接:点击打开链接 题意:一群猴子,每个猴子均在唯一的一个组里,可单独成组。当两个猴子要打架时,若在同一组,不可以打架,若不在一组,每个猴子找到本组中最强壮的去迎战,打完架的两个猴子,强壮值减半,而且这两组猴子合并为一组。 由最强壮的猴子迎战,而且要合并组,可以想到左偏树(有合并操作的堆)。不同于简单的左偏树模板的是,由于要尽快的找到某个节点的堆顶,借助于并查集的思路,存每个节点的父亲节点

不忘初心 518

hdu1512-Monkey King- 左偏树+并查集

题意: 有n个猴子,,一开始每个猴子只认识自己,每个都有自己的力量  m个操作,每次给x y,表示x和y打架, 先判断x,y是否有同一个老大,如果是,输出-1,不打, 否则,让各自的老大(种群中力量值最大者) 打一架,后果是各自老大力量值减半,从此两个种群合并,仍旧是力量值最大的为新老大。输出新老大的力量值。 思路: 对于记录猴子的种群,就是用并查集,每次让猴子种群中力量最大的来打

缺氧 541
上一篇: Codeforces Round #395 (Div. 2) A,B,C,D 题解
下一篇: BZOJ 1097: [POI2007]旅游景点atr 状压,预处理,最短路
just_sort
博客等级 码龄11年 2357粉丝 1667原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值