【二次扫描换根法】JZOJ_5776 小x游世界树

2024-01-30 04:38

本文主要是介绍【二次扫描换根法】JZOJ_5776 小x游世界树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意

一棵有 N N N个节点的树,上面每个点都有一个魔法阵,走到了这个点上会被魔法阵传送回根节点,每个魔法阵只能用一次,且每个节点上有一个加速平台,可以使以这个点为起点的边需要的体力值减小。求以哪个节点为根可以使得走到每一个点的体力值总和最小。

思路

我们可以发现,一条边需要走 z s y zs_y zsy次,其中 y y y为边的终点, z s i zs_i zsi代表节点 i i i的子树节点总和(包括 i i i),我们可以先求出根节点为 1 1 1时的最小体力值以及每个点的子树个数,然后进行换根操作。
我们设 f i f_i fi i i i为根节点时的最小体力值,可以得出转移方程:
f y = f x − z s y ∗ ( w − q x ) + ( N − z s y ) ∗ ( w − q y ) f_y=f_x-zs_y*(w-q_x)+(N-zs_y)*(w-q_y) fy=fxzsy(wqx)+(Nzsy)(wqy),其中 w w w代表 w ( x , y ) w(x,y) w(x,y) q i q_i qi代表这个点的加速平台可以减少的体力值
自行画图理解(逃

代码

#include<cstdio>struct node {int to, w, next;
}e[1400001];
int head[700001], zs[700001], q[700001];
long long f[700001];
int N, tot = 1, ans = 1;void dfs_(int fa, int p) {//第一次扫描zs[p] = 1;for (int i = head[p]; i; i = e[i].next) {if (e[i].to == fa) continue; dfs_(p, e[i].to);zs[p] += zs[e[i].to];f[1] += (e[i].w - q[p]) * zs[e[i].to];}
}void dfs__(int fa, int p) {//换根if (f[p] < f[ans] || (f[p] == f[ans] && p < ans)) ans = p;for (int i = head[p]; i; i = e[i].next) {if (e[i].to == fa) continue;f[e[i].to] = f[p] - zs[e[i].to] * (e[i].w - q[p]) + (N - zs[e[i].to]) * (e[i].w - q[e[i].to]);dfs__(p, e[i].to);}
}int main() {scanf("%d", &N);for (int i = 1; i <= N; i++) scanf("%d", q + i);int x, y, z; for (int i = 1; i < N; i++) {scanf("%d %d %d", &x, &y, &z);e[++tot] = (node){y, z, head[x]};head[x] = tot;e[++tot] = (node){x, z, head[y]};head[y] = tot;}dfs_(0, 1);dfs__(0, 1);printf("%d\n%lld", ans, f[ans]);
}

这篇关于【二次扫描换根法】JZOJ_5776 小x游世界树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/659128

相关文章

揭秘世界上那些同时横跨两大洲的国家

我们在《世界人口过亿的一级行政区分布》盘点全球是那些人口过亿的一级行政区。 现在我们介绍五个横跨两州的国家,并整理七大洲和这些国家的KML矢量数据分析分享给大家,如果你需要这些数据,请在文末查看领取方式。 世界上横跨两大洲的国家 地球被分为七个大洲分别是亚洲、欧洲、北美洲、南美洲、非洲、大洋洲和南极洲。 七大洲示意图 其中,南极洲是无人居住的大陆,而其他六个大洲则孕育了众多国家和

一些数学经验总结——关于将原一元二次函数增加一些限制条件后最优结果的对比(主要针对公平关切相关的建模)

1.没有分段的情况 原函数为一元二次凹函数(开口向下),如下: 因为要使得其存在正解,必须满足,那么。 上述函数的最优结果为:,。 对应的mathematica代码如下: Clear["Global`*"]f0[x_, a_, b_, c_, d_] := (a*x - b)*(d - c*x);(*(b c+a d)/(2 a c)*)Maximize[{f0[x, a, b,

简单的Q-learning|小明的一维世界(3)

简单的Q-learning|小明的一维世界(1) 简单的Q-learning|小明的一维世界(2) 一维的加速度世界 这个世界,小明只能控制自己的加速度,并且只能对加速度进行如下三种操作:增加1、减少1、或者不变。所以行动空间为: { u 1 = − 1 , u 2 = 0 , u 3 = 1 } \{u_1=-1, u_2=0, u_3=1\} {u1​=−1,u2​=0,u3​=1}

简单的Q-learning|小明的一维世界(2)

上篇介绍了小明的一维世界模型 、Q-learning的状态空间、行动空间、奖励函数、Q-table、Q table更新公式、以及从Q值导出策略的公式等。最后给出最简单的一维位置世界的Q-learning例子,从给出其状态空间、行动空间、以及稠密与稀疏两种奖励函数的设置方式。下面将继续深入,GO! 一维的速度世界 这个世界,小明只能控制自己的速度,并且只能对速度进行如下三种操作:增加1、减

独立按键单击检测(延时消抖+定时器扫描)

目录 独立按键简介 按键抖动 模块接线 延时消抖 Key.h Key.c 定时器扫描按键代码 Key.h Key.c main.c 思考  MultiButton按键驱动 独立按键简介 ​ 轻触按键相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通与断开。  ​ 按键抖动 由于按键内部使用的是机

【线性代数】正定矩阵,二次型函数

本文主要介绍正定矩阵,二次型函数,及其相关的解析证明过程和各个过程的可视化几何解释(深蓝色字体)。 非常喜欢清华大学张颢老师说过的一段话:如果你不能用可视化的方式看到事情的结果,那么你就很难对这个事情有认知,认知就是直觉,解析的东西可以让你理解,但未必能让你形成直觉,因为他太反直觉了。 正定矩阵 定义 给定一个大小为 n×n 的实对称矩阵 A ,若对于任意长度为 n 的非零向量 ,有 恒成

【Linux】萌新看过来!一篇文章带你走进Linux世界

🚀个人主页:奋斗的小羊 🚀所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 前言💥1、初识Linux💥1.1 什么是操作系统?💥1.2 各种操作系统对比💥1.3 现代Linux应用💥1.4 Linux常用版本 💥2、Linux 和 Windows 目录结构对比💥2.1 文件系统组织方式💥2.2

Elasticsearch:无状态世界中的数据安全

作者:来自 Elastic Henning Andersen 在最近的博客文章中,我们宣布了支持 Elastic Cloud Serverless 产品的无状态架构。通过将持久性保证和复制卸载到对象存储(例如 Amazon S3),我们获得了许多优势和简化。 从历史上看,Elasticsearch 依靠本地磁盘持久性来确保数据安全并处理陈旧或孤立的节点。在本博客中,我们将讨论无状态的数据持

【AI大模型应用开发】2.1 Function Calling连接外部世界 - 入门与实战(1)

Function Calling是大模型连接外部世界的通道,目前出现的插件(Plugins )、OpenAI的Actions、各个大模型平台中出现的tools工具集,其实都是Function Calling的范畴。时下大火的OpenAI的GPTs,原理就是使用了Function Calling,例如联网检索、code interpreter。 本文带大家了解下Function calling,看

005:VTK世界坐标系中的相机和物体

VTK医学图像处理---世界坐标系中的相机和物体 左侧是成像结果                                                    右侧是世界坐标系中的相机与被观察物体 目录 VTK医学图像处理---世界坐标系中的相机和物体 简介 1 在三维空间中添加坐标系 2 世界坐标系中的相机 3 世界坐标系中vtkImageData的参数 总结: