[题解]逃离地球

news/2024/7/8 4:06:55/文章来源:https://www.cnblogs.com/Sinktank/p/18285083

题意简述

有一个星系,共有\(n*m\)个星球,排成\(n\)\(m\)列。

初始星球之间没有道路。接下来给定\(P\)种魔法\(1\)\(Q\)种魔法\(2\)

  • 魔法\(1\):第\(i\)种魔法用\(a_i,b_i,c_i\)描述。表示你可以任选星系的一行,在第\(a_i\)和第\(b_i\)个星球之间建立一条航道,消耗\(c_i\)的能量。
  • 魔法\(2\):第\(i\)种魔法用\(x_i,y_i,z_i\)描述。表示你可以任选星系的一列,在第\(x_i\)和第\(y_i\)个星球之间建立一条航道,小号\(z_i\)的能量。

询问要想让所有星球互相连通,最少需要消耗多少太阳能。

思路简述

根据贪心的思想,我们如果找到一种魔法消耗很小,那我们会想到对所有行/列都使用这种一次魔法。

于是想到使用最小生成树来解决。把行标和列标看作节点,魔法看作边,魔法消耗看作边权。那么就相当于对这样一个拥有\(2\)棵树的森林跑一次最小生成树。需要注意的是,不能先跑行再跑列,而是需要一同排序,一并处理。原因就是行数和列数是在变化的(比如我们已经对所有列都使用了魔法,连接了\(1,2\)行,那么我们可以理解为我们删掉了\(1\)行。因为只要能连接到第\(2\)行的一定也能连接到第\(1\)行。所以我们再对行使用魔法的时候就可以少考虑一行,即这一组魔法总消耗应该等于 单次消耗\(\times(\)当前行数\(-1)\))。

正确性证明:
设有两边权值分别是\(u,v\),而\(u>v\)。那么

  • 显然\(u,v\)同为魔法\(1\)或同为魔法\(2\)时先用\(v\)最优。

  • 如果\(u,v\)一个是魔法\(1\),一个是魔法\(2\),则先用\(u\)和先用\(v\)的花费如下:

    • 先用\(u\)\(u*n+v*(m-1)=u*n+v*m-v\)
    • 先用\(v\)\(v*m+u*(n-1)=u*n+v*m-u\)

    故还是先用\(v\)更优。

代码使用Kruskal实现,需要用并查集。为了行标和列标不冲突所以行标节点统一\(+m\)存储,因此注意空间需要开\(2\)倍。

#include<bits/stdc++.h>
#define N 100010
#define M 100010
#define int long long
using namespace std;
struct edge{int u,v,w;
}edges[2*M];//开两倍是因为行列都要存
bool cmp(edge a,edge b){return a.w<b.w;} 
int n,m,p,q,fa[2*N],ans;
int find(int x){if(fa[x]==x) return x;else return fa[x]=find(fa[x]);
}
signed main(){cin>>n>>m>>p>>q;for(int i=1;i<=n+m;i++) fa[i]=i;for(int i=1;i<=p;i++){//选行连列 cin>>edges[i].u>>edges[i].v>>edges[i].w;}for(int i=p+1;i<=p+q;i++){//选列连行 cin>>edges[i].u>>edges[i].v>>edges[i].w;edges[i].u+=m,edges[i].v+=m;}sort(edges+1,edges+1+p+q,cmp);int nn=n,mm=m;for(int i=1,cnt=0;i<=p+q;i++){int u=find(edges[i].u),v=find(edges[i].v);if(u==v) continue;cnt++;fa[u]=v;if(u<=m) ans+=nn*edges[i].w,mm--;//列节点else ans+=mm*edges[i].w,nn--;//行节点 if(cnt==n+m-2) break;}cout<<ans;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

寻找适合编写静态分析规则的语言

目前静态分析工具的主要痛点:无法开发自定义规则、对误报和漏报的规则无法快速修改,以及开发自定义规则有一定的难度。为了解决这些问题,我们需要寻找适合编写静态分析规则的语言。本文分享自华为云社区《寻找适合编写静态分析规则的语言》,作者:Uncle_Tom。 1. 程序静态分…

使用JAVA调用配方单保存接口更新数据失败, 使用了SaveParam参数

问题原因是SaveParam参数使用错误 传入json只能是model里的单据数据参数, model之外的参数是靠SaveParam的实例去设置, 金蝶的demo里也是很明显的, 如下图

博客的部署方法论

博客写完后,当然是要发布到网络上的。如果想要部署到服务器上,则需编译构建成静态文件,然后将其上传到服务器上的路径(该路径由我们自己决定),然后在 web 服务器(Nginx 等)上配置访问路径即可10.部署 博客写完后,当然是要发布到网络上的。如果想要部署到服务器上,则需…

安全帽佩戴检测系统

安全帽佩戴检测算法是高危作业环境中不可或缺的环节。传统依靠人工监管的方式存在效率低下、管理范围有 限、时效性差、无法全场监测等诸多缺陷,因此基于图像视觉的安全帽佩戴检测算法逐渐成为企业实施管理的主要手段。近年来,随着工业4.0概念的提出和深度学习等 高新技术的发…

基于 .net core 8.0 的 swagger 文档优化分享-根据命名空间分组显示

之前也分享过 Swashbuckle.AspNetCore 的使用,不过版本比较老了,本次演示用的示例版本为 .net core 8.0,从安装使用开始,到根据命名空间分组显示,十分的有用前言公司项目是是微服务项目,网关是手撸的一个.net core webapi 项目,使用 refit 封装了 20+ 服务 SDK,在网关中…

安全帽佩戴检测算法

安全帽佩戴检测算法是铁路工程施工人员安全管理中的重点和难点,它对检测算法的准确 率与检测速度都有较高的要求。本文提出一种基于神经网络架构搜索的安全帽佩戴检测算法 NAS-YOLO。该神经网络架构由上、下行操作单元组成,采用二进制门策略对网络架构进行更 新,通过数据驱动…

人员跌倒识别检测算法

人员跌倒识别检测算法是基于视频的检测方法,通过对目标人体监测,当目标人体出现突然倒地行为时,自动监测并触发报警。 人员跌倒识别检测算法基于计算机识别技术,配合现场摄像头,自动识别如地铁手扶梯/楼梯、老幼活动区等公共场所人员摔倒行为,准确率高于90%,及时救援,提…

学校视频监控系统

学校视频监控系统可以借助分布在学校各处的传统监控摄像头对学校的日常生活进行实时安防监控,学校视频监控系统保障学校的日常安全以及对学生的人身财产安全进行及时预警。帮助学校在技术日益进步的当下,提升对学校的安防监控能力和日常管理的效率,使得学校在安防监控这方面…

读人工智能全传03分治策略

读人工智能全传03分治策略1. 黄金年代 1.1. 图灵在他发表的论文《计算机器与智能》中介绍了图灵测试,为人工智能学科迈出第一步做出了重大贡献 1.2. 美国在第二次世界大战后几十年里计算机技术发展的特色,也是美国在未来60年内确立人工智能领域国际领先地位的核心 1.3. 1955年…

[6.27~7.4 做题记录]

[6.27~7.4 做题记录] 暑假集训,记录一些有意义 (多半无意义) 题目,不定时更新。 概率期望DP OSU! 考虑设 \(E_i\) 为到第 \(i\) 次操作时的期望分数。我们发现从 \(x^3\) 到 \((x+1)^3\) 将加上 \(3x^2+3x+1\),我们考虑 \(x\) 和 \(x^2\) 的期望: \[x1_i=(x1_{i-1}+1)\time…

Power BI实用技巧——外部工具DAX studio

Power BI实用技巧——外部工具DAX studio 当你想要将Power BI表格对象数据导出,Power BI却告诉你:您的数据过大可能会执行一些数据抽样,点击继续导出一份CSV文件,却发现Power BI只能导出三万行数据,这该怎么办呢? 这里我们就要推荐一款非常实用的外挂级软件——DAX studi…

一款EF Core下高性能、轻量级针对分表分库读写分离的解决方案

前言 今天大姚给大家分享一款EF Core下高性能、轻量级针对分表分库读写分离的解决方案,开源(Apache License)的EF Core拓展程序包:ShardingCore。 ShardingCore项目介绍 ShardingCore是一款开源、简单易用、高性能、普适性,针对EF Core生态下的分表分库的扩展解决方案,支…

java中堆污染(heap pollution)以及@SafeVarargs注解使用

什么是堆污染 heap pollution堆污染发生在使用可变参数(varargs)或泛型时,将不兼容的类型插入到一个泛型对象中。这会导致在运行时尝试访问这些对象时发生 ClassCastException。例如:public static void heapPollutionExample(List<String>... stringLists) {Object[…

e语音 【删除文本右边字符】

删除 “#换行符”代码本文来自博客园,作者:__username,转载请注明原文链接:https://www.cnblogs.com/code3/p/18284992

从OpenAI停服看中国市场:国产替代崛起的机遇与挑战

一、OpenAI 停服事件背景 OpenAI 自 2020 年推出 GPT-3 以来,在全球范围内引起了极大的反响。其强大的自然语言处理能力使其成为许多企业和开发者的首选工具。然而,2024 年 6 月 25 日,许多中国用户收到了一封来自 OpenAI 的邮件,邮件中明确表示,自 2024 年 7 月 9 日起,…

云锵投资 2024 年 6 月简报

季报摘要行情:二次探底; 微盘策略:大幅回撤,逻辑基础小幅动摇,但继续运行; 本季度量化基金策略业绩:-4.3085%,中,全国排名:7532;平均 Beta:1.00; 本季度量化股票策略业绩:-16.8934%,差,全国排名:11198;平均 Beta:1.84;(优良中差,表明全国排名四位分) 行…

全网最适合入门的面向对象编程教程:09 类和对象的Python实现-类之间的关系,你知道多少?

本文主要对类之间的关系进行了基本介绍,包括继承、组合、依赖关系,并辅以现实中的例子加以讲解,同时说明了不同关系的特点和应用场景。全网最适合入门的面向对象编程教程:09 类和对象的 Python 实现-类之间的关系,你知道多少? 摘要: 本文主要对类之间的关系进行了基本介…

[LeetCode] 274. H-Index

意外的简单。 class Solution:def hIndex(self, citations: List[int]) -> int:sorted_list = sorted(citations, reverse=True)ret = 0for i,element in enumerate(sorted_list[:1000]):curr = min(i+1, element)if curr > ret:ret = currreturn ret

数据换机

图1为本系统的方法的流程示意图图2为首次拷贝到X中断需要遍历的文件示意图图3为非首次拷贝找到X中断点需要遍历的文件示意图 实现的功能支持换机对SD卡的数据迁移大文件按阈值切成切片文件小文件和切片文件按阈值分段拷贝切片文件的恢复小文件和切片文件从换机cache下恢复到三…

实战篇——文件上传漏洞upload-labs-master靶场实战一

实战篇——文件上传漏洞upload-labs-master靶场实战(1) 前端验证绕过 (1) 篡改js代码 直接上传一句话木马失败:查看页面源代码:可见前端通过checkFile函数对上传文件的后缀名进行了验证。 使用Tampermonkey自定义js脚本,用于删除form表单的onsubmit属性:启用脚本,刷新页面…