Problem

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\) 自然 希望找到最优翻修方案,请你帮助他求出这个最优翻修方案的不便利值。

Input Format

第一行为正整数\(n\)。

接下来\(n — 1\)行,每行描述一个城市。其中第\(i\)行包含两个数\(s_i,t_i\)。\(s_i\)表示通向第\(i\)座城市 的公路的起点,\(t_i\)表示通向第i座城市的铁路的起点。如果\(s_i > 0\),那么存在一条从第\(s_i\)座城 市通往第\(i\)座城市的公路,否则存在一条从第\(-s_i\)个乡村通往第i座城市的公路;\(t_i\)类似地,如 果\(t_i > 0\),那么存在一条从第\(t_i\)座城市通往第i座城市的铁路,否则存在一条从第\(-t_i\)个乡村通 往第\(i\)座城市的铁路。

接下来\(n\)行,每行描述一个乡村。其中第i行包含三个数\(a_i,b_i,c_i\),其意义如题面所示。

Output Format

输出一行一个整数,表示最优翻修方案的不便利值。

Sample

Input 1

  1. 6
  2. 2 3
  3. 4 5
  4. -1 -2
  5. -3 -4
  6. -5 -6
  7. 1 2 3
  8. 1 3 2
  9. 2 1 3
  10. 2 3 1
  11. 3 1 2
  12. 3 2 1

Output 1

  1. 54

Input 2

  1. 9
  2. 2 -2
  3. 3 -3
  4. 4 -4
  5. 5 -5
  6. 6 -6
  7. 7 -7
  8. 8 -8
  9. -1 -9
  10. 1 60 1
  11. 1 60 1
  12. 1 60 1
  13. 1 60 1
  14. 1 60 1
  15. 1 60 1
  16. 1 60 1
  17. 1 60 1
  18. 1 60 1

Output 2

  1. 548

Input 3

  1. 12
  2. 2 4
  3. 5 3
  4. -7 10
  5. 11 9
  6. -1 6
  7. 8 7
  8. -6 -10
  9. -9 -4
  10. -12 -5
  11. -2 -3
  12. -8 -11
  13. 53 26 491
  14. 24 58 190
  15. 17 37 356
  16. 15 51 997
  17. 30 19 398
  18. 3 45 27
  19. 52 55 838
  20. 16 18 931
  21. 58 24 212
  22. 43 25 198
  23. 54 15 172
  24. 34 5 524

Output 3

  1. 5744902

Explanation

Explanation for Input 1

一种不便利值等于54的方法是:翻修通往城市2和城市5的铁路,以及通往其他城市的 公路。用→和⇒表示公路和铁路,用∗→和∗⇒表示翻修的公路和铁路,那么:

编号为1的乡村到达首都的路线为:-1 ∗→ 3 ⇒ 1,经过0条未翻修公路和1条未翻修铁 路,代价为3 × (1 + 0) × (2 + 1) = 9;

编号为2的乡村到达首都的路线为:-2 ⇒ 3 ⇒ 1,经过0条未翻修公路和2条未翻修铁 路,代价为2 × (1 + 0) × (3 + 2) = 10;

编号为3的乡村到达首都的路线为:-3 ∗→ 4 → 2 ∗→ 1,经过1条未翻修公路和0条未 翻修铁路,代价为3 × (2 + 1) × (1 + 0) = 9;

编号为4的乡村到达首都的路线为:-4 ⇒ 4 → 2 ∗→ 1,经过1条未翻修公路和1条未翻 修铁路,代价为1 × (2 + 1) × (3 + 1) = 12;

编号为5的乡村到达首都的路线为:-5 → 5 ∗⇒ 2 ∗→ 1,经过1条未翻修公路和0条未 翻修铁路,代价为2 × (3 + 1) × (1 + 0) = 8;

编号为6的乡村到达首都的路线为:-6 ∗⇒ 5 ∗⇒ 2 ∗→ 1,经过0条未翻修公路和0条未翻修铁路,代价为1 × (3 + 0) × (2 + 0) = 6;

总的不便利值为9 + 10 + 9 + 12 + 8 + 6 = 54。可以证明这是本数据的最优解。

Explanation for Input 2

在这个样例中,显然应该翻修所有公路。

Range

一共20组数据,编号为1 ∼ 20。 对于编号\(\le 4\)的数据,\(n \le 20\);

对于编号为5 ∼ 8的数据,\(a_i,b_i,c_i \le 5\),\(n \le 50\);

对于编号为9 ∼ 12的数据,\(n \le 2000\);

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

Algorithm

\(DP\)

Mentality

\(HNOI2018\) 的 \(Day2T3......\) 一道据说许多人考场上看成神题的题目 \(QwQ\) 。

平心而论这道题确实也就那么难,顶天了 \(TG\ T2\) ,就是谁叫它放在 \(Day2T3\) 呢,造成了一系列误会 = = 。

那么我们看到题之后,发现了数据范围里最后一句表达的意思就是树的深度不超过 \(40\) ,于是难度进一步缩减 \(......\)

考虑倒推 \(DP\) ,我们设 \(f[i][A][B]\) 代表到了 \(i\) 节点,从 \(i\) 到根节点中有 \(A\) 条未翻修公路以及 \(B\) 条未翻修铁路,\(i\) 的子树中所有乡村到根节点的最小代价。那么 \(DP\) 式子其实就很简单了:

\[f[i][A][B]=min(f[ls][A+1][B]+f[rs][A][B],f[ls][A][B]+f[rs][A][B+1])
\]

向左儿子走会增加一条公路,这是 \(A+1\) 的由来,向右儿子走增加一条铁路,这是 \(B+1\) 的由来,而不增加的是选择翻修到那个儿子节点的路。

如果到达叶子节点,直接枚举计算式子结果。

接下来就只有一个问题了,那就是空间不够,但是由于我们每棵树只有两颗子树,所以我们先用 \(tmp\) 记录下其中一个子树的 \(DP\) 值,再处理另一颗子树,而我们的第一维 \(i\) ,则变成 \(deep[i]\) ,也即深度。

那么答案就是 \(f[1][0][0]\) ,确实蛮好弄的 \(......\)

Code

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. int n,ls[20001],rs[20001];
  5. long long f[42][42][42],tmp[42][42][42],a[20001],b[20001],c[20001];
  6. void Save(int x,int A,int B)
  7. {
  8. for(int i=0;i<=A+1;i++)
  9. for(int j=0;j<=B;j++)
  10. tmp[x][i][j]=f[x][i][j];
  11. }
  12. void DP(int x,int deep,int A,int B)
  13. {
  14. if(x<0)
  15. {
  16. for(int i=0;i<=A;i++)
  17. for(int j=0;j<=B;j++)
  18. f[deep][i][j]=c[-x]*(a[-x]+i)*(b[-x]+j);//若为叶子节点处理 dp 值
  19. return;
  20. }
  21. DP(ls[x],deep+1,A+1,B);
  22. Save(deep+1,A+1,B);//先存下左子树的 dp 值
  23. DP(rs[x],deep+1,A,B+1);
  24. for(int i=0;i<=A;i++)
  25. for(int j=0;j<=B;j++)
  26. f[deep][i][j]=min(tmp[deep+1][i+1][j]+f[deep+1][i][j],f[deep+1][i][j+1]+tmp[deep+1][i][j]);//状态转移
  27. }
  28. int main()
  29. {
  30. cin>>n;
  31. for(int i=1;i<n;i++)
  32. scanf("%d%d",&ls[i],&rs[i]);
  33. for(int i=1;i<=n;i++)
  34. scanf("%lld%lld%lld",&a[i],&b[i],&c[i]);
  35. DP(1,1,0,0);
  36. cout<<f[1][0][0];
  37. }

【HNOI 2018】道路的更多相关文章

  1. [HNOI 2018]道路

    Description 题库链接 给出一棵含有 \(n\) 个叶子节点的二叉树,对于每个非叶子节点的节点,其与左儿子相连的边为公路,其与右儿子相连的边为铁路.对于每个节点,选择一条与其儿子相连的铁路或 ...

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

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

  3. [HNOI 2014]道路堵塞

    Description A国有N座城市,依次标为1到N.同时,在这N座城市间有M条单向道路,每条道路的长度是一个正整数.现在,A国 交通部指定了一条从城市1到城市N的路径,并且保证这条路径的长度是所有 ...

  4. [HNOI/AHOI2018]道路

    Description: W 国的交通呈一棵树的形状.W 国一共有\(n - 1\)个城市和\(n\)个乡村,其中城市从\(1\)到\(n - 1\) 编号,乡村从\(1\)到\(n\)编号,且\(1 ...

  5. HNOI 2018 简要题解

    寻宝游戏 毒瘤题. 估计考试只会前30pts30pts30pts暴力然后果断走人. 正解是考虑到一个数&1\&1&1和∣0|0∣0都没有变化,&0\&0& ...

  6. [HNOI 2018]游戏

    Description 题库链接 有 \(n\) 个房间排成一列,编号为 \(1,2,...,n\) ,相邻的房间之间都有一道门.其中 \(m\) 个门上锁,其余的门都能直接打开.现在已知每把锁的钥匙 ...

  7. [HNOI 2018]排列

    Description 题库链接 给定 \(n\) 个整数 \(a_1, a_2, \dots, a_n, 0 \le ai \le n\) ,以及 \(n\) 个整数 \(w_1, w_2, \do ...

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

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

  9. 【HNOI 2018】毒瘤

    Problem Description 从前有一名毒瘤. 毒瘤最近发现了量产毒瘤题的奥秘.考虑如下类型的数据结构题:给出一个数组,要求支持若干种奇奇怪怪的修改操作(例如给一个区间内的数同时加上 \(c ...

随机推荐

  1. CEditUI 控件使用

    SetLimitText(UINT nMax )  //设置文本限制字符数 参数为nMax为控件可接受的文本最大字节数 GetTextLength() //获得文本长度 参考文档:http://www ...

  2. 配置sudo日志审计

    1.检查sudo与syslog服务 centos [root@xiaoyuer ~]# rpm -qa|grep sudo sudo-1.8.6p3-24.el6.x86_64 [root@xiaoy ...

  3. linux中时间命令详解

    DATE hling@hling:~$ date2018年 04月 11日 星期三 19:43:04 CSThling@hling:~$ date +%Y%M%d20184311hling@hling ...

  4. shop_z 一套非常适合二次开发的php后台管理系统

    QQ群:247823727 如果你需要定制某些功能开联系群主,价格实惠,后期交接完善,有上手培训 shop_z基础thinkphp5  php7上开发运行,速度杠杠的 地址:https://gitee ...

  5. MSCKF_VIO:MSCKF的双目版本

    论文:MSCKF的双目版本 Robust Stereo Visual Inertial Odometry for Fast Autonomous Flight 下载地址:点击 源码地址:https:/ ...

  6. Codeforces 1136D - Nastya Is Buying Lunch - [贪心+链表+map]

    题目链接:https://codeforces.com/problemset/problem/1136/D 题意: 给出 $1 \sim n$ 的某个排列 $p$,再给出若干 $(x,y)$ 表示当序 ...

  7. linux之sed的使用

    基本介绍 sed是stream editor的缩写,一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲 ...

  8. 2、Flutter 填坑记录篇

    1.前言 之前写了一篇文章关于 flutter 初体验的一篇,https://www.cnblogs.com/niceyoo/p/9240359.html,当时一顿骚操作,然后程序就跑起来了. 隔了好 ...

  9. Kali2安装完成后的设置

    1.安装中文输入法 vim /etc/apt/sources.list 全部删除,改为国内源 #中科大 deb http://mirrors.ustc.edu.cn/kali kali-rolling ...

  10. sap 软件架构

    1: