Description:

W 国的交通呈一棵树的形状。W 国一共有\(n - 1\)个城市和\(n\)个乡村,其中城市从\(1\)到\(n - 1\) 编号,乡村从\(1\)到\(n\)编号,且\(1\)号城市是首都。道路都是单向的,本题中我们只考虑从乡村通往首都的道路网络。对于每一个城市,恰有一条公路和一条铁路通向这座城市。对于城市i, 通向该城市的道路(公路或铁路)的起点,要么是一个乡村,要么是一个编号比\(i\)大的城市。 没有道路通向任何乡村。除了首都以外,从任何城市或乡村出发只有一条道路;首都没有往 外的道路。从任何乡村出发,沿着唯一往外的道路走,总可以到达首都。

W 国的国王小 W 获得了一笔资金,他决定用这笔资金来改善交通。由于资金有限,小 W 只能翻修\(n - 1\)条道路。小 W 决定对每个城市翻修恰好一条通向它的道路,即从公路和铁 路中选择一条并进行翻修。小 W 希望从乡村通向城市可以尽可能地便利,于是根据人口调 查的数据,小 W 对每个乡村制定了三个参数,编号为\(i\)的乡村的三个参数是\(a_i\),\(b_i\)和\(c_i\)。假设 从编号为\(i\)的乡村走到首都一共需要经过\(x\)条未翻修的公路与\(y\)条未翻修的铁路,那么该乡村 的不便利值为

\[c_i \cdot (a_i + x) \cdot (b_i + y)
\]

在给定的翻修方案下,每个乡村的不便利值相加的和为该翻修方案的不便利值。 翻修\(n - 1\)条道路有很多方案,其中不便利值最小的方案称为最优翻修方案,小 W 自然 希望找到最优翻修方案,请你帮助他求出这个最优翻修方案的不便利值。

Hint:

对于所有的数据,\(n \le 20000\),\(1 \le a_i,b_i \le 60\),\(1 \le c_i \le 10^9\),\(s_i,t_i\)是\([-n,-1] \cup (i,n - 1]\)内的整数,任意乡村可以通过不超过40条道路到达首都。

Solution:

表面上不可做实际上并不难的树型dp

设 \(f[i][j][k]\) 表示在i节点,到根修了j条公路,k条铁路的代价

显然有转移:

\(f[i][j][k]=min(f[ls][j+1][k]+f[rs][j][k],f[ls][j][k],f[rs][j][k+1])\)

可以考虑直接出叶子节点的f值,然后由根的初始状态出发\(f[1][0][0]\),记忆化搜索

但是这题卡空间,但是树的最大深度为40,我们发现一个点只由儿子转移过来,所以只需开一条链的空间大小,详见代码:

#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define ls p<<1
#define rs p<<1|1
using namespace std;
typedef long long ll;
const int mxn=4e4+5;
int n,m,a[mxn],b[mxn],c[mxn],to[mxn][2];
ll f[105][85][85]; inline int read() {
char c=getchar(); int x=0,f=1;
while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}
while(c<='9'&&c>='0') {x=(x<<3)+(x<<1)+(c&15);c=getchar();}
return x*f;
}
inline int chkmax(int &x,int y) {if(x<y) x=y;}
inline int chkmin(int &x,int y) {if(x>y) x=y;} struct ed {
int to,nxt;
}t[mxn<<1]; void dfs(int u,int id,int x,int y)
{
if(to[u][0]) dfs(to[u][0],id+1,x+1,y);
if(to[u][1]) dfs(to[u][1],id+2,x,y+1);
if(u>n) {
for(int i=0;i<=x;++i)
for(int j=0;j<=y;++j)
f[id][i][j]=1ll*c[u]*(a[u]+i)*(b[u]+j);
}
else {
for(int i=0;i<=x;++i)
for(int j=0;j<=y;++j)
f[id][i][j]=min(f[id+1][i+1][j]+f[id+2][i][j],f[id+1][i][j]+f[id+2][i][j+1]);
}
} int main()
{
int u,v;
n=read(); memset(f,0x3f,sizeof(f));
for(int i=1;i<n;++i) {
u=read(); v=read();
if(u<0) u=-u+n;
if(v<0) v=-v+n;
to[i][0]=u; to[i][1]=v;
}
for(int i=1;i<=n;++i)
a[i+n]=read(),b[i+n]=read(),c[i+n]=read();
dfs(1,1,0,0);
printf("%lld",f[1][0][0]);
return 0;
}

[HNOI/AHOI2018]道路的更多相关文章

  1. 洛谷P4438 [HNOI/AHOI2018]道路(dp)

    题意 题目链接 Sol 每当出题人想起他出的HNOI 2018 Day2T3,他都会激动的拍打着轮椅 读题比做题用时长系列... \(f[i][a][b]\)表示从根到\(i\)的路径上,有\(a\) ...

  2. 【题解】Luogu P4438 [HNOI/AHOI2018]道路

    原题传送门 实际就是一道简单的树形dp 设f[u][i][j]表示从根结点到结点u经过i条未翻修公路,j条未翻修铁路的贡献最小值 边界条件:f[leaf][i][j]=(A+i)(B+j)C (题目上 ...

  3. 【题解】 [HNOI/AHOI2018]道路 (动态规划)

    懒得复制,戳我戳我 Solution: \(dp[i][j][k]\)以\(i\)为子树根节点,到根节点中有\(j\)条公路没修,\(k\)条铁路没修,存子树不便利和 \(dp[i][j][k]=mi ...

  4. P4438 [HNOI/AHOI2018]道路

    辣稽题目 毁我青春 耗我钱财. 设\(f[x][i][j]\)为从1号点走到x点经过i条公路j条铁路,子树的最小代价. \(f[leaf][i][j]=(A+i)(B+j)C\) \(f[x][i][ ...

  5. BZOJ5290 & 洛谷4438:[HNOI/AHOI2018]道路——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5290 https://www.luogu.org/problemnew/show/P4438 的确 ...

  6. Luogu 4438 [HNOI/AHOI2018]道路

    $dp$. 这道题最关键的是这句话: 跳出思维局限大胆设状态,设$f_{x, i, j}$表示从$x$到根要经过$i$条公路,$j$条铁路的代价,那么对于一个叶子结点,有$f_{x, i, j} = ...

  7. Luogu P4438 [HNOI/AHOI2018]道路

    题目 注意到\(n\)不大并且深度不大. 记\((u,ls_u)\)为\(L\)边,\((u,rs_u)\)为\(r\)边. 所以我们可以设\(f_{p,i,j}\)表示从根到\(p\)有\(i\)条 ...

  8. 【题解】Luogu P4436 [HNOI/AHOI2018]游戏

    原题传送门 \(n^2\)过百万在HNOI/AHOI2018中真的成功了qwqwq 先将没门分格的地方连起来,枚举每一个块,看向左向右最多能走多远,最坏复杂度\(O(n^2)\),但出题人竟然没卡(建 ...

  9. [Bzoj5285][洛谷P4424][HNOI/AHOI2018]寻宝游戏(bitset)

    P4424 [HNOI/AHOI2018]寻宝游戏 某大学每年都会有一次Mystery Hunt的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为新生 ...

随机推荐

  1. MySQL修改数据表存储引擎的3种方法介绍

    这篇文章主要介绍了MySQL修改数据表存储引擎的3种方法介绍,分别是直接修改.导出导入.创建插入3种方法, 可以参考下   MySQL作为最常用的数据库,经常遇到各种各样的问题.今天要说的就是表存储引 ...

  2. 【转】asp.net Core 系列【一】——创建Web应用

    ASP.NET Core 中的 Razor 页面介绍 Razor 页面是 ASP.NET Core MVC 的一个新功能,它可以使基于页面的编码方式更简单高效. 若要查找使用模型视图控制器方法的教程, ...

  3. 51 Nod 1256 乘法逆元(数论:拓展欧几里得)

    1256 乘法逆元  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K ...

  4. Vue自定义class覆盖第三方组件原有样式

    一个vue文件可以写多个<style></style>, 如果在style加上socped代表本组件的样式,不污染全局. 如果需要覆盖第三方组件样式,则不能加scoped,因此 ...

  5. 最短路径问题---Dijkstra算法详解

    侵删https://blog.csdn.net/qq_35644234/article/details/60870719 前言 Nobody can go back and start a new b ...

  6. python-中缀表达式转前缀表达式

    作完了中缀前缀,作一个归纳吧. https://www.cnblogs.com/unixfy/p/3344550.html # coding = utf-8 class Stack: def __in ...

  7. Git坑换行符自动转换 [转载]

    转自https://www.cnblogs.com/zjoch/p/5400251.html 源起 一直想在 GitHub 上发布项目.参与项目,但 Git 这货比较难学啊.买了一本<Git 权 ...

  8. IIS7 禁止目录运行脚本

    早晨看博客说有人被黑了:http://www.cnblogs.com/sanshi/p/3150639.html 看回复建议禁用上传目录的脚本运行权限 在IIS6上还是比较容易的,直接右键--属性,把 ...

  9. BZOJ4675

    题解: 考虑这么一件事情,n个人买彩票,在不断抽走卡片的时候,他们的中奖概率是不变的 所以在这道题中,由于每个人的操作次数是确定的,所以选每k个点的概率是相同的(因为如果我们逐一考虑每一次操作这个问题 ...

  10. 【AtCoder】ARC077

    C - pushpush 如果是按下标说的话 如果是偶数个 那么是 \(N,N - 2,N - 4...1,3,5...N - 1\) 如果是奇数个 \(N,N - 2,N - 4...2,4,6.. ...