左偏树解决猴王问题

news2024/11/25 14:49:31

一 问题描述

在森林里住着 N 只好斗的猴子。开始时,猴子们彼此不认识,难免吵架,吵架只发生在互不认识的两只猴子之间。吵架发生时,两只猴子都会邀请它们中最强壮的朋友来决斗。决斗过后,两只猴子和它们的所有朋友都认识对方,吵架不再发生。假设每只猴子都有一个强壮值,决斗后,强壮值会减少到原来的

一半(即10将减少到5,5将减少到2);且每只猴子都认识自己,如果它是所有朋友中最强壮的,那么它自己也会去决斗。确定决斗后它们所有朋友的最大强壮值。

二 输入和输出

1 输入

输入包含几个测试用例,每个测试用例都由两部分组成。第 1 部分的第 1 行包含一个整数 N(N≤10^5 ),表示猴子的数量;接下来的 N 行,每行都有一个数字,表示第 i 个猴子的强壮值 Vi(Vi≤32768)。第 2 部分的第 1 行包含一个整数 M(M≤10^5 ),表示发生了 M 次冲突;接下来的 M 行,每行都包含两个整数 x、y,表示第 x 个猴子和第 y 个猴子之间存在冲突。

2 输出

对每一次冲突,若两只猴子互相认识,则都输出 -1,否则输出决斗后它们所有朋友的最大强壮值。

三 输入和输出样例

1 输入样例

5

20

16

10

10

4

5

2 3

3 4

3 5

4 5

1 5

2 输出样例

8

5

5

-1

10

四 图解

根据输入样例1,初始状态如下图所示。

对输入样例的 5 种操作如下。

(1)2 3:猴子 2-3 决斗,强壮值减少一半,合并为一个群体,输出群体的最大强壮值 8。

(2)3 4:猴子 3-4 冲突,3 所在群体的最强壮猴子 2 和 4 决斗,强壮值减少一半,合并为一个群体,输出群体的最大强壮值 5。

(3)3 5:猴子 3-5 冲突,3 所在群体的最强壮猴子 3 和 5 决斗,强壮值减少一半,合并为一个群体,输出群体的最大强壮值 5。

(4)4 5:猴子 4-5 冲突,4 和 5 猴子在一个群体,输出 -1。

(5)1 5:猴子 1-5 冲突,5 所在群体的最强壮猴子 4 和 1 决斗,强壮值减少一半,合并为一个群体,输出群体的最大强壮值 10。

五 分析和设计

1 分析

本问题是典型的堆合并问题,可使用左偏树(可合并堆)解决。

2 设计

(1)利用并查集记录群体的集合号。

(2)若猴子 x 、y 冲突,且两者的集合号相同(fx=fy),则输出 -1,否则:删除 x 所在堆的堆顶 fx,然后将 fx 的权值减少一半,合并到原来的堆中;删除 y 所在堆的堆顶 fy,然后将 fy 的权值减少一半,合并到原来的堆中;将上面两个堆合并,输出堆顶的值。

六 代码

package com.platform.modules.alg.alglib.hdu1512;

public class Hdu1512 {
    public String output = "";
    private int maxn = 100010;

    int v[] = new int[maxn];
    int l[] = new int[maxn];
    int r[] = new int[maxn];
    int d[] = new int[maxn];
    int fa[] = new int[maxn];

    int merge(int x, int y) {
        if (x == 0) return y;
        if (y == 0) return x;
        if (v[x] < v[y]) {
            int temp = x;
            x = y;
            y = temp;

        }
        r[x] = merge(r[x], y);
        fa[r[x]] = x;
        if (d[l[x]] < d[r[x]]) {
            int temp = l[x];
            l[x] = r[x];
            r[x] = temp;
        }
        d[x] = d[r[x]] + 1;
        return x;
    }

    int find(int x) {
        if (fa[x] == x) {
            return x;
        } else {
            fa[x] = find(fa[x]);
            return fa[x];
        }
    }

    int pop(int x) {
        fa[l[x]] = l[x];
        fa[r[x]] = r[x];
        return merge(l[x], r[x]);
    }

    public String cal(String input) {
        int n, m, x, y;
        d[0] = -1;
        String[] line = input.split("\n");
        n = Integer.parseInt(line[0]);
        int count = 1;
        for (int i = 1; i <= n; i++) {
            v[i] = Integer.parseInt(line[count++]);
            l[i] = r[i] = d[i] = 0;
            fa[i] = i;
        }
        m = Integer.parseInt(line[count++]);

        while (m-- > 0) {
            String[] monkeys = line[count++].split(" ");
            x = Integer.parseInt(monkeys[0]);
            y = Integer.parseInt(monkeys[1]);

            int fx = find(x), fy = find(y);
            if (fx == fy) {
                output += "-1\n";
                continue;
            }
            int rt = pop(fx); // 删除最大值
            v[fx] /= 2;
            l[fx] = r[fx] = d[fx] = 0;
            fx = merge(rt, fx);
            rt = pop(fy);
            v[fy] /= 2;
            l[fy] = r[fy] = d[fy] = 0;
            fy = merge(rt, fy);
            rt = merge(fx, fy);
            output += String.format("%d\n", v[rt]);
        }

        return output;
    }
}

七 测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/100944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

screenviewer工具在树莓派3B+上的适配

目录 工具简介 适配初衷 第三方模块适配问题 源码代编译问题 最后完美运行如图 工具简介 屏幕截图web端展示功能、视频设备如摄像头、视频流等接入&#xff0c;并可web端展示。 适配初衷 这样的工具如果能完美运行在嵌入式linux上是极好的&#xff0c;目前仅适配了wind…

为什么你的程序跑不满CPU?——简单聊聊多核多线程

最近同事测试自己的程序&#xff0c;感觉处理耗时太长&#xff0c;一看CPU使用率&#xff0c;才25%。想要提高CPU使用率降低处理时长&#xff0c;于是向我询问。以此为契机写了这篇&#xff0c;聊聊多核多线程。水平有限&#xff0c;仅供参考。 1.单核单线程 一切开始的前提是…

CCProxy + Proxifier 通过另一台电脑访问网络

问题场景描述&#xff1a; 公司提供的 vpn 只提供了 windows 客户端&#xff1b;Mac没有客户端&#xff0c;而家里的 windows 电脑是多年前的旧电脑&#xff0c;配置不足&#xff0c;所以不能使用&#xff1b;这里整理了一种 搭建跳板机 作为中专的方式进行访问 搭建过程 1.…

OpenCV(7)-OpenCV中的滤波器

OpenCV中的滤波器 图像滤波 滤波的作用&#xff1a;一幅图像通过滤波器得到另一幅图像&#xff1b;其中滤波器又称为卷积核&#xff0c;滤波的过程被称为卷积 卷积的几个基本概念&#xff1a; 卷积核的大小&#xff1a; 卷积核一般为奇数&#xff0c;如3 * 3,5 * 5&#xf…

【DELM回归预测】基于matlab灰狼算法改进深度学习极限学习机GWO-DELM数据回归预测【含Matlab源码 1867期】

⛄一、基本极限学习机算法简介 1 核极限学习机 极限学习机(ELM)是一种含L个神经元的单隐藏层前馈神经网络(SLFN)算法&#xff0c;相比于其他神经网络(如BP)具有训练速度快和泛化能力强等特点。但是ELM算法是随机生成各个神经元连接权值和阈值&#xff0c;易造成算法的波动性和…

架构师必读 —— 逻辑模型(4)

解决问题的基本步骤 如果情绪急躁&#xff0c;过于钻牛角尖&#xff0c;坚持“这就是唯一结论”的态度&#xff0c;就会阻碍逻辑思考。情绪急躁、钻牛角尖的行为属短见薄识&#xff0c;只能导致主观臆断。一味地想“简短地传达观点”时&#xff0c;往往会跳过三角逻辑中的论据和…

VSCode下载和安装详细步骤

一、下载 点击 这里 到Visual Studio Code官网下载。 选择下载版本&#xff0c;大家按自己的电脑版本进行选择&#xff08;这里我选的是Windows 64位的&#xff09;。 二、安装 1. 下载好之后&#xff0c;双击进行安装&#xff1b; 2. 选择【我同意此协议】&#xff0c;再点…

如何快速上手react中的redux管理库

前言&#xff1a; 什么是redux&#xff1f;redux和vuex一样&#xff0c;都被统称为状态管理库&#xff0c;是核心数据存贮与分发、监听数据改变的核心所在。 可以简单说下redux和vuex的区别&#xff1a; 相同点 state 共享数据流程一致&#xff1a;定义全局state&#xff0c;…

【DELM回归预测】基于matlab粒子群算法改进深度学习极限学习机PSO-DELM数据回归预测【含Matlab源码 1884期】

⛄一、PSO-DELM简介 1 DELM的原理 在2004年&#xff0c;极限学习机&#xff08;extreme learning machine,ELM&#xff09;理论被南洋理工大学的黄广斌教授提出&#xff0c;ELM是一种单隐含层前馈神经网络&#xff08;single-hidden layer feedforward neural network,SLFN&am…

静态HTML个人音乐网页 大学生网页设计作业 简单音乐娱乐网页制作 DW个人网站模板下载 大学生简单音乐网页作品代码

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

基于风驱动算法改进的DELM预测-附代码

风驱动算法改进的深度极限学习机DELM的回归预测 文章目录风驱动算法改进的深度极限学习机DELM的回归预测1.ELM原理2.深度极限学习机&#xff08;DELM&#xff09;原理3.风驱动算法4.风驱动算法改进DELM5.实验结果6.参考文献7.Matlab代码1.ELM原理 ELM基础原理请参考&#xff1…

12月编程语言排行榜,java跌至低点,低代码发展迅猛

2022年12月编程语言排行榜&#xff1a;TIOBE Index for December 2022 TIOBE揭晓了12月全球编程语言排名&#xff0c;Python 以0.1%微弱优势领先C语言&#xff0c;成功夺冠。目前&#xff0c;这两种语言竞争焦灼&#xff0c;都是多次霸榜。 本次榜单&#xff0c;C作为一匹黑马…

chrome插件开发之发送网络请求v3版本

如果某个扩展希望访问自己所属域以外的资源&#xff0c;比如说来自http://www.google.com的资源(假设该扩展不是来自www.google.com), 浏览器不会允许这样的请求&#xff0c;除非该扩展获得了相应的跨域请求允许。 获取跨域请求允许 通过添加域名或者域名匹配到manifest文件的p…

CentOS 8:Redis服务器

Redis &#xff0c;一款基于内存的键值型数据库服务器 常见于网站开发场景 Redis 服务器只发布了 Linux 版本 Redis服务器的安装&#xff0c;有3种办法&#xff1a; 1 自动安装 , redis 5.0 yum install redis 2 源码方式 从官网下载源码&#xff0c;先编译、后部署 3 …

WhaleDI数据治理利器之“低成本数据质量管理”

数字化时代&#xff0c;数据已经成为企业管理的关键要素&#xff0c;随着数据的日益增长及汇聚&#xff0c;企业数据质量问题成为数据治理的关键。数据质量直接影响到能否通过数据分析驱动企业生产、运营、服务提效及创新。高质量的数据对管理决策、业务支撑等都有极其重要的作…

时间序列的研究

更多的时间预测&#xff0c;参考 https://github.com/qingsongedu/awesome-AI-for-time-series-papers#AI4TS-Tutorials 1. 周期检测模块 可能存在的情况&#xff0c; 单周期多周期无周期&#xff1b; Robust Period 检测 该时间序列&#xff0c;是否有周期 以及周期的长度…

C语言浮点型的存储

3.14159 1e10可以写成1.010的10次方 1e5 表示 1.010的5次方 int main() {int n 9;//4bytefloat* pFloat (float*)&n;//float 指针访问4的字节printf("n值为:%d", n);//9printf("*pFloat值为:%f\n", *pFloat);//&#xff0c;是以浮点数的视角去看的*p…

深度学习基础知识---梯度弥散 梯度爆炸

目录 1 梯度弥散、梯度爆炸的成因 2 解决方式 2.1.pretrainfinetune 2.2 梯度裁剪 2.3 权重正则化 2.5 Batch Normalization正则化 2.6 残差结构 shortcut 2.7 LSTM 1 梯度弥散、梯度爆炸的成因 神经网络的层&#xff08;主要是隐藏层&#xff09;越多&#xff0c;对…

【LSTM时序预测】基于matlab EMD结合LSTM风速数据预测【含Matlab源码 2051期】

⛄一、EMD-DELM简介 1 方法及原理 1.1 EMD基本原理 经验模态分解可基于数据本身&#xff0c;将复杂信号分解为一系列IMF和一个r(t),分解信号时&#xff0c;不需要预先设置任何基函数。因为这一特点&#xff0c;理论上EMD方法可预处理任何一种信号的数据&#xff0c;因此被广泛…

【Linux磁盘管理】

Linux磁盘管理 写在前面 在此强调一个 Linux 的核心机制就是一切皆文件。 I/O Ports 即I/O 设备地址&#xff0c;用来标识硬件对应的设备地址&#xff0c;来让操作系统以及 cpu 使用。 CPU 的核数不一定就是越多越好&#xff0c;由于CPU 协调之间的协调问题&#xff0c;可能性…