题目描述

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

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

ci⋅(ai+x)⋅(bi+y)c_i \cdot (a_i + x) \cdot (b_i + y)ci​⋅(ai​+x)⋅(bi​+y)

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

输入输出格式

输入格式:

第一行为正整数nnn 。

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

接下来nnn 行,每行描述一个乡村。其中第i行包含三个数ai,bi,cia_i,b_i,c_iai​,bi​,ci​ ,其意义如题面所示。

输出格式:

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

输入输出样例

输入样例#1:复制

6
2 3
4 5
-1 -2
-3 -4
-5 -6
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
输出样例#1:复制

54
输入样例#2:复制

9
2 -2
3 -3
4 -4
5 -5
6 -6
7 -7
8 -8
-1 -9
1 60 1
1 60 1
1 60 1
1 60 1
1 60 1
1 60 1
1 60 1
1 60 1
1 60 1
输出样例#2:复制

548
输入样例#3:复制

12
2 4
5 3
-7 10
11 9
-1 6
8 7
-6 -10
-9 -4
-12 -5
-2 -3
-8 -11
53 26 491
24 58 190
17 37 356
15 51 997
30 19 398
3 45 27
52 55 838
16 18 931
58 24 212
43 25 198
54 15 172
34 5 524
输出样例#3:复制

5744902

说明

【样例解释 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。可以证明这是本数据的最优解。

【样例解释 2】

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

【数据范围】
一共20组数据,编号为1 ∼ 20。
对于编号≤4\le 4≤4 的数据,n≤20n \le 20n≤20 ;
对于编号为5 ∼ 8的数据,ai,bi,ci≤5a_i,b_i,c_i \le 5ai​,bi​,ci​≤5 ,n≤50n \le 50n≤50 ;
对于编号为9 ∼ 12的数据,n≤2000n \le 2000n≤2000 ;
对于所有的数据,n≤20000n \le 20000n≤20000 ,1≤ai,bi≤601 \le a_i,b_i \le 601≤ai​,bi​≤60 ,1≤ci≤1091 \le c_i \le 10^91≤ci​≤109 ,si,tis_i,t_isi​,ti​ 是[−n,−1]∪(i,n−1][-n,-1] \cup (i,n - 1][−n,−1]∪(i,n−1] 内的整数,任意乡村可以通过不超过40条道路到达首都。

本以为必有高论。

有个鬼啊!

普及DP入门题套一个废话极多的题面就往HNOI里出。

不想多说。

下面是考场程序,数据分治都没删,把数组范围改一下就A了,考场20,无语。

 #include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (register int i=l; i<=r; i++)
typedef long long ll;
using namespace std; const int N=;
const ll inf=;
int n,x,y,fa[N],w[N],l1[N],l2[N],ch[N][],a[N],b[N],c[N];
ll ans,f[N>>][][]; void jud(){
ll res=;
rep(i,,n-){
int x=,y=;
for (int t=i+n; fa[t]; t=fa[t]){
if (w[t]==) x++;
if (w[t]==) y++;
}
res+=1ll*c[n+i]*(a[n+i]+x)*(b[n+i]+y);
}
ans=min(ans,res);
} void dfs(int dq){
if (dq==n) { jud(); return; }
w[ch[dq][]]^=; dfs(dq+); w[ch[dq][]]^=;
w[ch[dq][]]^=; dfs(dq+); w[ch[dq][]]^=;
} void get(int x){
if (!ch[x][]) return;
l1[ch[x][]]=l1[x]+; l2[ch[x][]]=l2[x];
l1[ch[x][]]=l1[x]; l2[ch[x][]]=l2[x]+;
get(ch[x][]); get(ch[x][]);
} ll get(int x,int i,int j){ return (ch[x][]) ? f[x][i][j] : 1ll*c[x]*(a[x]+i)*(b[x]+j); } void DP(int x){
if (!ch[x][]) return;
DP(ch[x][]); DP(ch[x][]);
rep(i,,l1[x]) rep(j,,l2[x])
f[x][i][j]=min(get(ch[x][],i,j)+get(ch[x][],i,j+),get(ch[x][],i+,j)+get(ch[x][],i,j));
} int main(){
freopen("road.in","r",stdin);
freopen("road.out","w",stdout);
scanf("%d",&n);
if (n<=){
rep(i,,n-){
scanf("%d%d",&x,&y);
if (x<=) x=-x+n-; if (y<=) y=-y+n-;
ch[i][]=x; ch[i][]=y; fa[x]=fa[y]=i; w[x]=; w[y]=;
}
rep(i,,n-) scanf("%d%d%d",&a[n+i],&b[n+i],&c[n+i]);
ans=inf; dfs(); printf("%lld\n",ans);
}else{
rep(i,,n-){
scanf("%d%d",&x,&y);
if (x<=) x=-x+n-; if (y<=) y=-y+n-;
ch[i][]=x; ch[i][]=y; fa[x]=fa[y]=i; w[x]=; w[y]=;
}
rep(i,,n-) scanf("%d%d%d",&a[n+i],&b[n+i],&c[n+i]);
get(); DP(); printf("%lld\n",f[][][]);
}
return ;
}

[HNOI2018]道路(DP)的更多相关文章

  1. [HNOI2018]道路 --- 树形DP

    [HNOI2018]道路 题目描述: W 国的交通呈一棵树的形状.W 国一共有 \(n-1\) 个城市和 \(n\) 个乡村, 其中城市从 \(1\) 到 \(n-1\) 编号,乡村从 \(1\) 到 ...

  2. 【BZOJ5290】 [Hnoi2018]道路

    BZOJ5290 [Hnoi2018]道路 前言 这道题目我竟然没有在去年省选切? 我太菜了. Solution 对题面进行一个语文透彻解析,发现这是一个二叉树,乡村都是叶子节点,城市都有两个儿子.( ...

  3. 5290: [Hnoi2018]道路

    5290: [Hnoi2018]道路 链接 分析: 注意题目中说每个城市翻新一条连向它的公路或者铁路,所以两种情况分别转移一下即可. 注意压一下空间,最后的叶子节点不要要访问,空间少了一半. 代码: ...

  4. BZOJ.5290.[AHOI/HNOI2018]道路(树形DP)

    BZOJ LOJ 洛谷 老年退役选手,都写不出普及提高DP= = 在儿子那统计贡献,不是在父亲那统计啊!!!(这样的话不写这个提高DP写记忆化都能过= =) 然后就令\(f[x][a][b]\)表示在 ...

  5. 洛谷4438 [Hnoi2018]道路 【树形dp】

    题目 题目太长懒得打 题解 HNOI2018惊现普及+/提高? 由最长路径很短,设\(f[i][x][y]\)表示\(i\)号点到根有\(x\)条未修公路,\(y\)条未修铁路,子树所有乡村不便利值的 ...

  6. 【BZOJ5290】[HNOI2018]道路(动态规划)

    [BZOJ5290][HNOI2018]道路(动态规划) 题面 BZOJ 洛谷 题目直接到洛谷上看吧 题解 开始写写今年省选的题目 考场上我写了一个模拟退火骗了\(90\)分...然而重测后只剩下45 ...

  7. bzoj 5290: [Hnoi2018]道路

    Description Solution PJDP毁青春 注意到性质:到根的道路不超过 \(40\) 条 所以我们只关系一个点上面的道路的情况就行了 设 \(f[x][i][j]\) 表示一个点 \( ...

  8. [HNOI2018] 道路

    Description 给一棵二叉树,每个叶子节点 \(i\) 有三个属性 \(a_i,b_i,c_i\) 每个非叶子节点都能标记向左右儿子中的一条边(记作 \(x\) 边和 \(y\) 边) 设叶子 ...

  9. [BZOJ5290][HNOI2018]道路

    bzoj luogu sol 考场上普及\(dp\)都做不来,果然是思想僵化了. 设\(f[u][i][j]\)表示在\(u\)点,上方有\(i\)条未修复的公路和\(j\)条未修复的铁路的最小花费. ...

随机推荐

  1. MongoDB加索引

    1.登陆MongoDB, 命令行在MongoDB主目录下执行:mongo -port 27017 2.切换至需要添加索引的db 并授权 use MeetingBooking db.auth({&quo ...

  2. SQLNET跟踪tnsping过程

    原文地址:SQLNET跟踪tnsping过程 作者:yingyifeng306 sqlnet是oracle提供的与网络层面交互的一个工具,比如如何解析客户端发起的连接,如何对客户端发起的连接进行辨别, ...

  3. (转)用python获取页面返回的cookie

    网址如下: crifan:http://www.crifan.com/get_cookie_from_web_response_in_python/ . . . .

  4. ViewPager使用--文章集锦

    viewpager中彻底性动态添加.删除Fragment Android ViewPager使用详解 fragment中嵌套viewpager,vierpager中有多个fragment,不显示 .. ...

  5. java迭代map

    java迭代map: import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.ut ...

  6. Junit使用的超简单介绍

    Junit使用的超简单介绍 前言:我对Junit了解的并不多,只是今天突然听到有人提到了它,而且现在时间还早,所以我觉得我不妨更一篇关于Junit4的超级超级简单的用法,全当是为了省去看官网demo的 ...

  7. 知问前端——工具提示UI

    工具提示(tooltip),是一个非常实用的UI.它彻底扩展了HTML中的title属性,让提示更加丰富,更加可控制,全面提升了用户体验. 调用tooltip()方法 在调用tooltip()方法之前 ...

  8. bzoj 1012 基础线段树

    原题传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1012 今儿一天状态不好,都没怎么刷题..快下课了,刷道水题.... 裸的线段树 /*** ...

  9. Cpython解释器支持的进程与线程

    一.理论部分 一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): egon在一个时间段内有很多任务要做:python备课的 ...

  10. C/C++里的const(2)

    对于如下几个语句,哪些定义相同?哪些定义不同?哪些数据可修改?哪些数据不可修改呢? const int a; int const a; const int *a; int *const a; int ...