P3647 题解

文章目录

  • P3647 题解
    • Overview
    • Description
    • Solution
      • Lemma
        • Proof
      • Main
    • Code

P3647 题解

Overview

很好的题,但是难度较大。

模拟小数据!——【数据删除】

Description

给定一颗树,有边权,已知这棵树是由这两个操作得到的:

  • Append(u, w):在 u u u w w w 之间连一条红边,注意这里的 w w w 必须是新点
  • Insert(u, v, w):在 u u u w w w v v v w w w 之间各连一条蓝边,注意这里的 w w w 必须是新点

问蓝线的长度最大能到多少。

Solution

我们可以尝试将所有的 Insert 所产生的蓝边对都提取出来。
它们只可能有两种形式:son - u - fatherson1 - u - son2

Lemma

引理:所有的蓝边都可以在某一个根上表现出形如 son - u - father 的形式。

Proof

当树上没有形如 son1 - u - son2 的蓝边时,显然成立;

当树上恰好有一个形如 son1 - u - son2 的蓝边时,可以将 son1son2 其中之一作为根,解决问题;

当树上有大于一个形如 son1 - u - son2 的蓝边时,可以证明不存在这样的边。
如图,当存在形如 1 的情况时,son1son2 构成了单独的连通块,因为如果不是,那么 son1son2 一定会是父子关系,矛盾;
当存在多个这样的连通块时,如图 2,建树时节点一定会组成单一的连通块,因为 u u u 总是存在,所以不成立。
only one component can exist

Main

有了引理,就可以树形 dp 了。

枚举树根,对每个根 DP。设 d u , 0 / 1 d_{u,0/1} du,0/1 u u u 为根, u u u 是否为蓝边终点的子树最大边权和。

先看 d u , 0 d_{u,0} du,0,因为没有边上的限制,所以可以任意取,对于是中点的情况,可以再加上边权 w ( u , v ) w(u,v) w(u,v),即 max ⁡ ( d v , 1 + w ( u , v ) , d v , 0 ) \max(d_{v,1}+w(u,v), d_{v,0}) max(dv,1+w(u,v),dv,0)
再看 d u , 1 d_{u,1} du,1,一定有一个 d v , 0 + w ( u , v ) d_{v,0}+w(u,v) dv,0+w(u,v),其它都是 max ⁡ ( d v , 1 + w ( u , v ) , d v , 0 ) \max(d_{v,1}+w(u,v), d_{v,0}) max(dv,1+w(u,v),dv,0),所以要加上 max ⁡ Δ sum \max \Delta_{\text{sum}} maxΔsum

所以关于 d d d 的状态转移方程可以这样写:

d u , 0 = ∑ v ∈ son ( u ) max ⁡ ( d v , 1 + w ( u , v ) , d v , 0 ) d u , 1 = d u , 0 + max ⁡ v ∈ son ( u ) { d v , 0 + w ( u , v ) − max ⁡ ( d v , 1 + w ( u , v ) , d v , 0 ) } d_{u,0} = \sum_{v\in \text{son}(u)}\max(d_{v,1}+w(u,v),d_{v,0})\\d_{u,1} = d_{u,0}+\max_{v\in \text{son}(u)}\{d_{v,0} + w(u,v) - \max(d_{v,1} + w(u,v), d_{v,0})\} du,0=vson(u)max(dv,1+w(u,v),dv,0)du,1=du,0+vson(u)max{dv,0+w(u,v)max(dv,1+w(u,v),dv,0)}

这样,就可以枚举根得到 O ( n 2 ) O(n^2) O(n2) 的复杂度, 15 pts 15\text{pts} 15pts

接下来考虑换根 DP。

一张图解释接下来两个 DP 数组的含义。

g is the ans k is the curr_up
这里的 g g g 并不描述这个子树,而是以 u u u 为根的整棵树

根据 f f f 的转移方程,我们照样也可以推出 g g g k k k 的转移方程,留给读者思考。

注意到方程里仍有大量之前可以利用的内容,所以需要维护最大值和次大值。

Code

#include <bits/stdc++.h>using namespace std;int dp[200001][2], dp1[200001][2], dp2[200001][2], mx[200001], mx2[200001];vector<pair<int, int> > gv[200001];inline void add_edge(int u, int v, int w){gv[u].push_back(make_pair(v, w));gv[v].push_back(make_pair(u, w));
}void dfs(int u, int fa){vector<int> vec;vec.push_back(INT_MIN), vec.push_back(INT_MIN);for(auto v : gv[u]){if(v.first == fa) continue;dfs(v.first, u);dp[u][0] += max(dp[v.first][0], dp[v.first][1] + v.second);vec.push_back(dp[v.first][0] + v.second - max(dp[v.first][0], dp[v.first][1] + v.second));}sort(vec.begin(), vec.end(), greater<int>());mx[u] = vec[0], mx2[u] = vec[1];dp[u][1] = dp[u][0] + mx[u];
}void dfs1(int u, int fa, int lst){for(auto v : gv[u]){if(v.first == fa) continue;int tmp = dp[v.first][0] + v.second - max(dp[v.first][0], dp[v.first][1] + v.second);dp2[u][0] = dp1[u][0] - max(dp[v.first][0], dp[v.first][1] + v.second);dp2[u][1] = dp2[u][0] + (mx[u] == tmp ? mx2[u] : mx[u]);if(fa + 1) dp2[u][1] = max(dp2[u][1], dp2[u][0] + dp2[fa][0] + lst - max(dp2[fa][0], dp2[fa][1] + lst));dp1[v.first][0] = dp[v.first][0] + max(dp2[u][0], dp2[u][1] + v.second);
//		dp1[v.first][1] = dp1[v.first][0] + max(mx[v.first], dp2[u][0] + v.second - max(dp2[u][0], dp2[u][1] + v.second));dfs1(v.first, u, v.second);}
}void init_vars(){// type your initiating code...
}void solve(int testcase, ...){init_vars();int n; cin >> n;for(int i = 0; i < n - 1; i++){int u, v, w; cin >> u >> v >> w;add_edge(u, v, w);}dfs(1, -1); dp1[1][0] = dp[1][0];dfs1(1, -1, 0);int ans = 0;for(int i = 1; i <= n; i++){//cout << mx[i] << " " << mx2[i] << endl;ans = max(ans, dp1[i][0]);}cout << ans << endl;
}signed main(){
#ifdef filesfreopen(".in", "r", stdin);freopen(".out", "w", stdout);
#endifios::sync_with_stdio(0);cin.tie(0), cout.tie(0);solve(1);
#ifdef filesfclose(stdin); fclose(stdout);
#endifreturn 0;
}/**  things to check*  1.  int overflow or long long memory need*  2.  recursion/array/binary search/dp/loop bounds*  3.  precision*  4.  special cases(n=1,bounds)*  5.  delete debug statements*  6.  initialize(especially multi-tests)*  7.  = or == , n or m ,++ or -- , i or j , > or >= , < or <=*  8.  keep it simple and stupid*  9.  do not delete, use // instead*  10. operator priority*  11. is there anything extra to output?*  12. THINK TWICE CODE ONCE, THINK ONCE DEBUG FOREVER*  13. submit ONCE, AC once. submit twice, WA forever*  14. calm down and you'll get good rank*  15. even a bit wrong scores zero*  16. ...**//**  something to think about*  1. greedy? dp? searching? dp with matrix/ segment tree? binary search? ...?*  2. If it is difficult, why not the opposite?**//*##########   ############   #####         #########                 #####      ####       ####
####                 #####        ####     ####
####             ##########        ####   ####
####               #####              #####
####              #####               #########            #####                ################  #############         #####
*/

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

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

相关文章

Stable Diffusion 模型下载:RealCartoon-Pixar - V8

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十下载地址模型介绍 这个检查点是从 RealCartoon3D 检查点分支出来的。它的目标是在整体上产生更多的“皮克斯”风格。我非常喜欢3D卡通的外观,希望能够创建出具有

无人机动力系统高倍率锂聚合物电池介绍,无人机锂电池使用与保养,无人机飞行控制动力源详解

无人机电池使用及保养 电池是无人机飞行的动力来源,也是一个消耗品&#xff0c;对电池充分了解&#xff0c;采取正确的使用方法&#xff0c;妥善进行维护保养将有助于提高飞行的安全性、延长电池的使用寿命。以下将详细对电池的使用和管理进行讲解。 高倍率锂聚合物电池的含义…

【MySQL】:深入理解并掌握DML和DCL

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. DML1.1 添加数据1.2 修改数据1.3 删除数据 二. DCL2.1 管理用户2.2 权限控制…

华为配置交换机KPI信息上报分析器示例组网图形

配置交换机KPI信息上报分析器示例 组网图形 图1 KPI信息上报拓扑图 组网需求操作步骤配置文件 组网需求 如图1所示&#xff0c;某企业网络用一台华为公司iMaster NCE-CampusInsight作为分析器对交换机设备进行智能运维管理。iMaster NCE-CampusInsight与交换机之间已经实现路由…

Ajax+JSON学习二

AjaxJSON学习二 文章目录 前言三、前后端数据交互3.1. GET请求3.2. POST请求3.3. jQuery 中的 Ajax3.4. Ajax 的替代品&#xff1a;fetch3.5. 小结 四、JSON4.1. JSON简介4.2. JSON 语法规则4.3. JSON的解析和序列化 总结 前言 三、前后端数据交互 3.1. GET请求 GET 请求一般用…

【Golang】定时任务Cron指南-毫秒级任务支持

文章目录 CronCron快速使用时间表达式最小分钟级任务最小秒级任务预定义的时间表 时区Job选项Job 包装器WithLogger 支持毫秒级任务 Cron 版本&#xff1a;v3.0.0 仓库&#xff1a;https://github.com/robfig/cron cron是golang实现定时任务比较好的库, 这个库提供了一个简单而…

Tomcat 原理分析

1、Tomcat 的组成 如下图&#xff1a; Tomcat组成 Server&#xff1a; Tomcat 封装的、对外提供完整的、基于组件的 web 服务&#xff0c;包含 Connectors、Container 两个核心组件&#xff0c;以及多个功能组件&#xff0c;各个 Service 之间是独立的&#xff0c;但是共享 同…

MoE-LLaVA:具有高效缩放和多模态专业知识的大型视觉语言模型

视觉和语言模型的交叉导致了人工智能的变革性进步&#xff0c;使应用程序能够以类似于人类感知的方式理解和解释世界。大型视觉语言模型(LVLMs)在图像识别、视觉问题回答和多模态交互方面提供了无与伦比的能力。 MoE-LLaVA利用了“专家混合”策略融合视觉和语言数据&#xff0…

B2075 幂的末尾(洛谷)

复制Markdown 展开 题目描述 a的b次方的末 3 位数是多少&#xff1f; 输入格式 两个正整数 a&#xff0c;b。1≤a≤100&#xff0c;1≤b≤10000。 输出格式 从高位到低位输出幂的末三位数字&#xff0c;中间无分隔符。若幂本身不足三位&#xff0c;在前面补零。 输入输出…

【笔记】Helm-5 Chart模板指南-8 命名模板

命名模板 此时需要越过模板&#xff0c;开始创建其他内容了。该部分我们会看到如何在一个文件中定义 命名模板&#xff0c;并在其他地方使用。命名模板&#xff08;有时称作一个部分或一个子模板&#xff09;仅仅是在文件内部定义的模板&#xff0c;并使用了一个名字。有两种创…

打印斐波那契数列

定义&#xff1a; 斐波那契数列是指这样一个数列&#xff1a;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xff0c;13&#xff0c;21&#xff0c;34&#xff0c;55&#xff0c;89……这个数列从第3项开始 &#xff0c;每一项都等于前两项之和。 …

2402d,d引入新的勾挂降级

原文 我正在试为ArrayLiteralExps添加一个降级模板.它应该调用_d_arrayliteralTX1.我在expressionsem.d中引入了以前的所有降级,并打算通过在此处添加它来同样处理该降级. 但是,ArrayLiteralExps比其他式更挑剔,因为编译器干了许多优化,并最终创建了额外的ArrayLiteralExps或…

各种能源折标准煤参考系数

各种能源折标准煤参考系数Conversion Factors from Physical Units to Coal Equivalent能源名称平均低位发热量折标准煤系数EnergyAverage Low Calorific ValueConversion Factor原煤20 908千焦/(5 000千卡)/千克0.7143千克标准煤/千克Raw Coal20 908 kjoule/(5 000 kcal)/kg0.…

k8s-项目部署案例

一、容器交付流程 在k8s平台部署项目流程 在K8s部署Java网站项目 DockerFile 如果是http访问&#xff0c;需要在镜像仓库配置可信任IP 三、使用工作负载控制器部署镜像 建议至少配置两个标签 一个是声明项目类型的 一个是项目名称的 继续配置属性 资源配额 健康检查 五、使…

GraphicsMagick 的 OpenCL 开发记录(三十四)

文章目录 如何写ScaleImage()的硬件加速函数&#xff08;八&#xff09; <2022-05-05 周四> 如何写ScaleImage()的硬件加速函数&#xff08;八&#xff09; 我觉得Y方向的缩放以下面这种ScaleFilter()的方法是实现不了的&#xff0c;我只能添加进X方向的处理&#xff0…

【集合系列】HashMap 集合

HashMap 集合 1. 概述2. 方法3. 遍历方式4. 代码示例15. 代码示例26. 注意事项 其他集合类 父类 Map 实现类 LinkedHashMap 集合类的遍历方式 具体信息请查看 API 帮助文档 1. 概述 HashMap 是 Java 中的一种集合类&#xff0c;它实现了 Map 接口。HashMap 使用键值对存储数据…

手动汉化unity编辑器,解决下载中文语言报错问题

手动汉化unity编辑器&#xff0c;解决下载中文语言报错问题 START 最近在下载支持微信小程序版本的编辑器时&#xff0c;中文语言包&#xff0c;一直无法下载。记录一下 手动汉化unity编辑器的方法 &#xff0c;帮助和我遇到同样问题的人。 解决方案 1. 下载汉化包 https:…

ubuntu22.04@laptop OpenCV Get Started: 005_rotate_and_translate_image

ubuntu22.04laptop OpenCV Get Started: 005_rotate_and_translate_image 1. 源由2. translate/rotate应用Demo3 translate_image3.1 C应用Demo3.2 Python应用Demo3.3 平移图像过程 4. rotate_image4.1 C应用Demo4.2 Python应用Demo4.3 旋转图像过程 5. 总结6. 参考资料 1. 源由…

unity-ios-解决内购商品在Appstore上面已配置,但在手机测试时却无法显示的问题

自己这几天用 unity 2021 xcode 14.2 开发ios内购&#xff0c;appstore上面内购商品都已经配置好了&#xff0c;但是在手机里就是不显示&#xff0c;最后才发现必需得满足以下条件才行&#xff1a; 1. Appstore后台 -> 内购商品 -> 商品状态必需为『准备提交』以上状态…

springboot/ssm大学生就业服务平台就业招聘宣传管理系统Java系统

springboot(ssm大学生就业服务平台 就业招聘宣传管理系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;springboot&#xff08;可改ssm&#xff09; vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql…