P12007 【MX-X10-T3】[LSOT-4] 全国联赛?题解

news/2025/4/3 0:25:45/文章来源:https://www.cnblogs.com/YhjOI/p/18804531

一. 题面:点这里

二. 思路:

首先有一个比较常用的 trick 就是对于任意一颗带权树,对于题目中所求的两点对之间的距离和有如下公式:

\[Sum_{dis}=\sum_{e\in E}w(e)\times size_v\times(n-size_v) \]

这个公式应当是容易理解的,那么最后的贡献就可以这么算,但是现在有一个连边的问题。这和最优化问题有关,可以 dp 吗?好像不太现实,那我们考虑贪心。一步步来,首先你肯定会有一个疑问就是如果要连边,应当连到这个连通块的哪一个点呢。因为连通块本身的点对之间距离是确定的,考虑其他连通块连过来时造成的贡献,显然我们应当让这个连接点到这个连通块其他部分的距离和最小(很好证明)。关于距离和最小这个问题是经典的,可以其中一个解法是可以考虑换根dp 。解决这个问题之后,我们就要考虑我们分别连接哪些联通块是最优的呢。让我们回到算贡献的式子,那么我们应当是希望这个图是菊花图(假设我们把所有连通块内部的点缩成一个点之后),这样可以最小化每一个形如 \(x(n-x)\) 的乘积式。问题是菊花图的中心是什么呢。我们猜想是连通块大小最大的那一个,证明考虑反证法,假设调换最大块和某一块的值,一定不会使答案变小,手搓一个二次函数图像之后就会发现这个问题等价于证明:任意一个正整数 \(t\) 表示不是最大块的大小都有:

\[t\leq n-\max\{size\} \]

那么这是显然成立的(请读者自行思考,这是简单的。)
所以最后只需要以最大块向外连边即可,至于连边的顺序,考虑将边权大的连向乘积贡献小的连通块即可。

三. Code:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
#define ll __int128 
inline int read() {int x=0,f=1;char ch=getchar();while(ch > '9' || ch < '0'){if(ch == '-'){f = -1;}ch = getchar();}while(ch >= '0'&&ch <= '9'){x = x * 10 + ch - 48; ch = getchar();}return x * f;
}inline void write(ll x)
{if (x < 0) putchar('-'), x = -x;if (x > 9) write(x / 10);putchar(x % 10 + 48);return;
}
const int N = 1e6 + 5,MOD = 1e9 + 7;
int siz[N],a[N];
std::vector<std::pair<int,int> > G[N];ll dfs(int u,int fa)
{siz[u] = 1;ll res = 0;for(auto now : G[u]){int v = now.first,w = now.second;if(v == fa) continue;res += dfs(v,u) + 1ll * siz[v] * w;siz[u] += siz[v];}return res;
}ll tmp_res = 0,mn = 0;
void chgrt_dp(int u,int fa,ll mn_now,int now_siz)
{mn = std::min(mn,mn_now);tmp_res += mn_now;for(auto now : G[u]){int v = now.first,w = now.second;if(v == fa) continue;chgrt_dp(v,u,mn_now + 1ll * (now_siz - siz[v]) * w - 1ll * siz[v] * w,now_siz);}
}bool cmp(int a,int b){return a > b;}
int main()
{int n,m;n = read(),m = read();for(int i = 1;i <= m;++i){int u,v,w;u = read(),v = read(),w = read();G[u].push_back({v,w});G[v].push_back({u,w});}for(int i = 1;i <= n - m - 1;++i) a[i] = read();std::sort(a + 1,a + n - m);std::vector<int> p;ll ans = 0;for(int i = 1;i <= n;++i){if(!siz[i]){mn = dfs(i,0);tmp_res = 0;chgrt_dp(i,0,mn,siz[i]);ans += tmp_res / 2 + 1ll * (n - siz[i]) * mn;p.push_back(siz[i]);}}std::sort(p.begin(),p.end(),cmp);for(int i = 1;i <= n - m - 1;++i) ans += 1ll * (n - p[i]) * p[i] * a[i];write(ans % MOD);return 0;
}

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

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

相关文章

在Ubutnu22.04 显卡3090上安装cuda12.4

一、 检查驱动状态 nvidia-smi 如果没有以下输出就要安装一下驱动 在ubutnu22.04中安装3090使用以下命令sudo apt update && sudo apt upgrade && sudo apt install gcc makesudo apt install nvidia-driver-550驱动搞定就重启 sudo reboot二、安装cua 12.4 …

基于阿里云可观测产品构建企业级告警体系的通用路径与最佳实践

前言 1.1 日常生活中的告警 任何连续稳定运行的生产系统都离不开有效的监控与报警机制。通过监控,我们可以实时掌握系统和业务的运行状态;而报警则帮助我们及时发现并响应监控指标及业务中的异常情况。在日常生活中,我们也经常遇到各种各样的告警。例如,在驾驶传统机动车时…

No.4可视化大屏--vite+vue3 Flex布局和grid布局

一、Flex 弹性盒子布局(一维布局)<script setup></script><template> <div><div class="container"><div class="item">1</div><div class="item">2</div><div class="item&qu…

别再把时间花在甘特图上了!预期管理才是项目成败的关键

我刚入行做项目经理那会儿,特别沉迷于做漂亮的甘特图。 记得有一次,为了把一个项目的甘特图做得尽善尽美,我花了整整三天时间调整每个任务的起止日期、依赖关系,连周末都搭进去了。 结果呢?项目上线后客户还是不满意,说"这不是我们想要的"。 那一刻我才恍然大悟…

如何在 IDE 里使用 DeepSeek?

近期,阿里云百炼平台重磅推出 DeepSeek-V3、DeepSeek-R1、DeepSeek-R1-Distill-Qwen-32B 等 6 款模型,进一步丰富其 AI 模型矩阵。与此同时,通义灵码也紧跟步伐,全新上线模型选择功能,支持基于百炼的 DeepSeek-V3 和 DeepSeek-R1 满血版671B模型,为 AI 编程领域注入新活力…

UE4 打包Android apk (32位and64位) 血与泪的教训

文章适用于UE4.27打包 安卓32/64位apk。 这两天用ue4打包安卓apk遇到了不少问题,吐血研究了一天,终于解决所有问题,完成打包。 环境要求 最好用Android Studio 4.0,一定不要用很高的版本,之后下载 NDK21.4.7075529、java8环境、SDK版本 Android10,0(API 29)、Android9.0(A…

springboot快速集成neo4j

1.导入坐标,我这里是springboot3.0.2<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-neo4j</artifactId></dependency> 2.写ymlspring:data:neo4j:database: neo4j:uri: bolt://localho…

使用kind快速搭建本地k8s集群

学科:云平台部署与搭建 姓名:田凯蕾 学号:23593115

SpringAI用嵌入模型操作向量数据库!

嵌入模型(Embedding Model)和向量数据库(Vector Database/Vector Store)是一对亲密无间的合作伙伴,也是 AI 技术栈中紧密关联的两大核心组件,两者的协同作用构成了现代语义搜索、推荐系统和 RAG(Retrieval Augmented Generation,检索增强生成)等应用的技术基础。PS:准…

QEMU、KVM和DPU的关系

QEMU、KVM 和 DPU 在现代虚拟化与云计算架构中扮演不同角色,通过协同工作实现高性能、低延迟的资源虚拟化与硬件加速。以下是它们的关系及协作方式:1. 角色定位组件 核心功能 层级QEMU 提供硬件设备模拟、虚拟机生命周期管理,支持跨平台虚拟化(如模拟 ARM 设备)。 用户态K…

Javascript - 2

Javascript - 2 事件 DOM DOM - document object model - HTML 文档的结构化表示 由浏览器自动创建,以 树结构存储,每一个 HTML 元素(标签、内容、属性)都是一个对象 DOM允许我们使用 js 访问 HTML 元素和样式,以操作它们改变文本 改变 HTML 属性 改变 CSS 样式可以通过 j…

【QML】定时时间控制控件

代码:1 import QtQuick 2.152 import QtQuick.Controls 2.153 4 ApplicationWindow {5 width: 5006 height: 3007 visible: true8 title: "飞行时间设置"9 10 // 自定义时间选择组件11 Component {12 id: timeComponent13 …