Luogu P4438 [HNOI/AHOI2018]道路
题目
注意到\(n\)不大并且深度不大。
记\((u,ls_u)\)为\(L\)边,\((u,rs_u)\)为\(R\)边。
所以我们可以设\(f_{p,i,j}\)表示从根到\(p\)有\(i\)条未标记的\(L\)边和\(j\)条未标记的\(R\)边的最小答案。
对于叶子结点,枚举\(i,j\)套题目给的公式。
对非叶子节点,\(f_{p,i,j}=\min(f_{ls_p,i+1,j}+f_{rs_p,i,j+1},f_{ls_p,i,j+1}+f_{rs_p,i+1,j})\)。
注意到我们是在二叉树上dfs,所以对于一个点,我们计算完其儿子后,其儿子的\(f\)就不需要再用了。这个可以省空间。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=40007;
int n,a[N],b[N],c[N],ls[N],rs[N];ll f[81][41][41];
int read(){int x;scanf("%d",&x);return x;}
int get(){int x=read();return x>0? x:n-x;}
void dfs(int u,int k,int l,int r)
{
if(!ls[u])
{
for(int i=0,j;i<=l;++i) for(j=0;j<=r;++j) f[k][i][j]=1ll*c[u]*(a[u]+i)*(b[u]+j);
return ;
}
dfs(ls[u],k+1,l+1,r),dfs(rs[u],k+2,l,r+1);
for(int i=0,j;i<=l;++i) for(j=0;j<=r;++j) f[k][i][j]=min(f[k+1][i+1][j]+f[k+2][i][j],f[k+1][i][j]+f[k+2][i][j+1]);
}
int main()
{
n=read();int i;
for(i=1;i<n;++i) ls[i]=get(),rs[i]=get();
for(i=1;i<=n;++i) a[i+n]=read(),b[i+n]=read(),c[i+n]=read();
dfs(1,1,0,0),cout<<f[1][0][0];
}
Luogu P4438 [HNOI/AHOI2018]道路的更多相关文章
- 【题解】Luogu P4438 [HNOI/AHOI2018]道路
原题传送门 实际就是一道简单的树形dp 设f[u][i][j]表示从根结点到结点u经过i条未翻修公路,j条未翻修铁路的贡献最小值 边界条件:f[leaf][i][j]=(A+i)(B+j)C (题目上 ...
- 洛谷P4438 [HNOI/AHOI2018]道路(dp)
题意 题目链接 Sol 每当出题人想起他出的HNOI 2018 Day2T3,他都会激动的拍打着轮椅 读题比做题用时长系列... \(f[i][a][b]\)表示从根到\(i\)的路径上,有\(a\) ...
- P4438 [HNOI/AHOI2018]道路
辣稽题目 毁我青春 耗我钱财. 设\(f[x][i][j]\)为从1号点走到x点经过i条公路j条铁路,子树的最小代价. \(f[leaf][i][j]=(A+i)(B+j)C\) \(f[x][i][ ...
- Luogu 4438 [HNOI/AHOI2018]道路
$dp$. 这道题最关键的是这句话: 跳出思维局限大胆设状态,设$f_{x, i, j}$表示从$x$到根要经过$i$条公路,$j$条铁路的代价,那么对于一个叶子结点,有$f_{x, i, j} = ...
- 【题解】Luogu P4436 [HNOI/AHOI2018]游戏
原题传送门 \(n^2\)过百万在HNOI/AHOI2018中真的成功了qwqwq 先将没门分格的地方连起来,枚举每一个块,看向左向右最多能走多远,最坏复杂度\(O(n^2)\),但出题人竟然没卡(建 ...
- BZOJ5290 & 洛谷4438:[HNOI/AHOI2018]道路——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5290 https://www.luogu.org/problemnew/show/P4438 的确 ...
- [HNOI/AHOI2018]道路
Description: W 国的交通呈一棵树的形状.W 国一共有\(n - 1\)个城市和\(n\)个乡村,其中城市从\(1\)到\(n - 1\) 编号,乡村从\(1\)到\(n\)编号,且\(1 ...
- luogu P4437 [HNOI/AHOI2018]排列
luogu 问题本质是把\(a_i\)作为\(i\)的父亲,然后如果有环就不合法,否则每次要取数,要满足取之前他的父亲都被取过(父亲为0可以直接取),求最大价值 贪心想法显然是要把权值大的尽量放在后面 ...
- 【题解】 [HNOI/AHOI2018]道路 (动态规划)
懒得复制,戳我戳我 Solution: \(dp[i][j][k]\)以\(i\)为子树根节点,到根节点中有\(j\)条公路没修,\(k\)条铁路没修,存子树不便利和 \(dp[i][j][k]=mi ...
随机推荐
- B/S文件上传下载解决方案
需求: 项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在20G内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以20G来进行限制. PC端全平台支持,要求支持Window ...
- 【PKUSC2019】线弦图【计数】【树形DP】【分治FFT】
Description 定义线图为把无向图的边变成点,新图中点与点之间右边当且仅当它们对应的边在原图中有公共点,这样得到的图. 定义弦图为不存在一个长度大于3的纯环,纯环的定义是在环上任取两个不相邻的 ...
- (Java多线程系列三)线程间通讯
Java多线程间通讯 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同. 1.使用wait()和notify()方法在线程中通讯 需求:第一个线程写入(input)用户,另一个线程 ...
- CentOS查看和修改PATH环境变量的方法
查看PATH:echo $PATH以添加mongodb server为列修改方法一:export PATH=/usr/local/mongodb/bin:$PATH//配置完后可以通过echo $PA ...
- You Are Given a Decimal String...
B. You Are Given a Decimal String... 这个题需要求出从某一个尾数 n 变为 m 所需要的 x 和 y 的最小个数(i+j) 那么就需要预处理出一个数组来存放这个值. ...
- mysql报错处理:incompatible with sql_mode=only_full_group_by
问题: 服务报错:incompatible with sql_mode=only_full_group_by,如下图所示: 分析: NLY_FULL_GROUP_BY是MySQL提供的一个sql_mo ...
- C++入门经典-例5.16-输出引用
1:如不加特殊说明,一般认为引用指的都是左值引用.引用实际上是一种隐式指针,它为对象建立一个别名,通过操作符&来实现,引用的形式如下: 数据类型 & 表达式: 例如: int a=10 ...
- C++入门经典-例3.3-if-else语句的奇偶性判别
1:代码如下: // 3.3.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...
- js对象深拷贝、浅拷贝
浅拷贝1 //浅拷贝1 let obj01 = { name: 'Lily', age: '20', time: ['13', '15'], person: { name: 'Henry', age: ...
- ajax 调用 webService
前台脚本<script type="text/javascript"> $(function () { $.ajax({ type: "POST", ...