【二次扫描换根法】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

相关文章

Vue 调用摄像头扫描条码功能实现代码

《Vue调用摄像头扫描条码功能实现代码》本文介绍了如何使用Vue.js和jsQR库来实现调用摄像头并扫描条码的功能,通过安装依赖、获取摄像头视频流、解析条码等步骤,实现了从开始扫描到停止扫描的完整流... 目录实现步骤:代码实现1. 安装依赖2. vue 页面代码功能说明注意事项以下是一个基于 Vue.js

SQL注入漏洞扫描之sqlmap详解

《SQL注入漏洞扫描之sqlmap详解》SQLMap是一款自动执行SQL注入的审计工具,支持多种SQL注入技术,包括布尔型盲注、时间型盲注、报错型注入、联合查询注入和堆叠查询注入... 目录what支持类型how---less-1为例1.检测网站是否存在sql注入漏洞的注入点2.列举可用数据库3.列举数据库

IDEA常用插件之代码扫描SonarLint详解

《IDEA常用插件之代码扫描SonarLint详解》SonarLint是一款用于代码扫描的插件,可以帮助查找隐藏的bug,下载并安装插件后,右键点击项目并选择“Analyze”、“Analyzewit... 目录SonajavascriptrLint 查找隐藏的bug下载安装插件扫描代码查看结果总结Sona

python-nmap实现python利用nmap进行扫描分析

《python-nmap实现python利用nmap进行扫描分析》Nmap是一个非常用的网络/端口扫描工具,如果想将nmap集成进你的工具里,可以使用python-nmap这个python库,它提供了... 目录前言python-nmap的基本使用PortScanner扫描PortScannerAsync异

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

我们在《世界人口过亿的一级行政区分布》盘点全球是那些人口过亿的一级行政区。 现在我们介绍五个横跨两州的国家,并整理七大洲和这些国家的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 的非零向量 ,有 恒成