题目传送门

题目大意: 给出一棵树,每个点有一些木材,除了根节点外(本身就是伐木场),你需要选 kkk 个点造伐木场,每个点的木材最后会往根节点运送,如果到达了一个伐木场就停下,你要使总运费最小。

题解

很容易想到 wqswqswqs 二分,感觉 O(n3)O(n^3)O(n3) 的做法既繁琐还跑得慢。

给伐木场二分一个权值,然后设dp状态:fx,if_{x,i}fx,i​ 表示 xxx 往上第一个伐木场的深度为 iii,初值就是自己的木材运上去的运费,转移时在 fy,if_{y,i}fy,i​ 和 fy,depyf_{y,dep_y}fy,depy​​ 中取 min⁡\minmin 即可,以及需要记录个 gx,ig_{x,i}gx,i​ 表示最优方案用了几个伐木场。

就算不做什么优化,速度也是碾压 n3n^3n3 的 dpdpdp,我下面的几个提交是努力卡常的 n3n^3n3 dp做法:

而这个做法也有卡常的余地,随便卡卡能从 53ms53ms53ms 到 48ms48ms48ms,这还只是随便卡卡。

代码也十分好写:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 110
#define ll long longint n,k,w[maxn];
struct edge{int y,z,next;}e[maxn<<1];
int first[maxn],len=0;
void buildroad(int x,int y,int z){e[++len]=(edge){y,z,first[x]};first[x]=len;}
ll f[maxn][maxn];int g[maxn][maxn],dis[maxn];
void dfs(int x,int dep,int cost){for(int j=1;j<dep;j++)f[x][j]=1ll*(dis[dep]-dis[j])*w[x],g[x][j]=0;if(x==1)f[x][dep]=g[x][dep]=0;else f[x][dep]=cost,g[x][dep]=1;for(int i=first[x];i;i=e[i].next){int y=e[i].y;dis[dep+1]=dis[dep]+e[i].z;dfs(y,dep+1,cost);for(int j=1;j<=dep;j++){if(f[y][dep+1]<f[y][j])f[x][j]+=f[y][dep+1],g[x][j]+=g[y][dep+1];else f[x][j]+=f[y][j],g[x][j]+=g[y][j];}}
}int main()
{scanf("%d %d",&n,&k);n++;for(int i=2,fa,z;i<=n;i++){scanf("%d %d %d",&w[i],&fa,&z);buildroad(fa+1,i,z);}int l=0,r=2e9;ll ans=-1;while(l<=r){int mid=l+r>>1;dfs(1,1,mid);if(g[1][1]<=k)ans=f[1][1]-1ll*g[1][1]*mid,r=mid-1;else l=mid+1;}printf("%d",ans);
}

IOI 2005 Riv 河流 题解相关推荐

  1. BZOJ 1812 IOI 2005 riv

    1812: [Ioi2005]riv Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 566  Solved: 335 [Submit][Status] ...

  2. Luogu P3354 [IOI2005]Riv河流 题解———再加一维!再加一维!

    Description n≤100,k≤min(n,50)n≤100,k≤min(n,50)n≤100,k≤min(n,50). Solution 考虑树形dpdpdp. 状态设计为dpi,jdp_{ ...

  3. 『树形DP』[IOI2005]Riv 河流

    题目描述 题解 我们设f[x][j][k]f[x][j][k]f[x][j][k]表示运输完了以xxx为根的子树,iii的祖先jjj建立了伐木场,建立了kkk个伐木场的最小运输代价.由于题目中说明了0 ...

  4. 洛谷P3354 Riv河流 [IOI2005] 树型dp

    正解:树型dp 解题报告: 传送门! 简要题意:有棵树,每个节点有个权值w,要求选k个节点,最大化∑dis*w,其中如果某个节点到根的路径上选了别的节点,dis指的是到达那个节点的距离 首先这个一看就 ...

  5. [IOI2005]Riv 河流

    题目描述 几乎整个Byteland 王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一个村庄--B ...

  6. [IOI2005]Riv河流

    题目链接:洛谷,BZOJ 前置知识:莫得 题解 直接考虑dp.首先想法是设状态 \(dp[u][i]\) 表示u的子树内建 \(i\) 个伐木场且子树内木头都运到某个伐木场的最小花费.发现这样的状态是 ...

  7. [LUOGU] P3354 [IOI2005]Riv 河流

    题目描述 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一个村庄--名叫 ...

  8. 洛谷 P3354 [IOI2005]Riv 河流【树形dp】

    ... 题目: 题意: 分析: 代码: 题目: 传送门 题意: 给出一棵有nnn个节点的树,每条边有一个距离,每个点有一个权值 我们需要选出除根节点以外的kkk个节点,每个点的答案为该点的点权向上直到 ...

  9. P3354 [IOI2005]Riv 河流

    树形dp,设f[i][j][k]表示第i个点的子树中选择j个点作为伐木场,而且k是建了伐木场的最浅的i的祖先的情况下,最小的收益. 这种题还要练一下,咕咕 然后转移可以n4方做. // luogu-j ...

最新文章

  1. android中setdate不是静态,为什么当setData()和setType()不起作用时,android intent的setDataAndType()工作正常?...
  2. junit5 与 surefire 对接使用
  3. 能跑java的服务器_一台java服务器可以跑多少个线程?
  4. WinPcap笔记(2):获取设备列表
  5. paip.提升用户体验与安全性----登录与权限流程总结
  6. Javascript的简单介绍,只作为个人笔记,不作为知识参考,如果想要学习,请找其他文章
  7. python复杂非线性方程_python – 如何解决Sympy中的非线性方程?
  8. 虚拟机搭建Windows2003步骤详解
  9. 【飞行器】基于matlab四旋翼飞行器飞行控制系统【含Matlab源码 1266期】
  10. java 中鼠标事件_Java中的鼠标事件
  11. 日期格式 Wed Oct 16 00:00:00 CEST 2020 转换
  12. 颜色拾取器和红蜻蜓截图
  13. 【软件测试】软件测试职业规划
  14. 耳机电声测试仪软件,CLIO 11电声测试仪
  15. html打印图片不显示不全,Word里图片显示全打印不全是怎么回事
  16. 零知识证明系列之二——Schnorr协议
  17. 线型(Line styles)的英文名称
  18. 《算法4》读书笔记(二)
  19. LeCun主讲!纽约大学《深度学习》2021课程全部放出
  20. 血杀英雄为什么不显示服务器,全新传奇网游《血杀英雄》今日下午2点 内测新服「英雄无双」强势开启...

热门文章

  1. 用计算机怎么求锐角三角函数值,用计算器求锐角三角函数值与由锐角三角函数值求锐角.doc...
  2. 计算机毕业设计之仿12306火车票购票平台
  3. 挂载zookeeper到文件系统 (mount zookeeper)
  4. BZOJ 4605: 崂山白花蛇草水 树套树 权值线段树套kdtree
  5. 为什么特斯拉Q2业绩能超预期?
  6. 模拟支付宝、淘宝登录1
  7. 苹果鼠标怎么充电_“智能”还是“多功能”?米物智能鼠标垫测评
  8. 互联网出海现在还是风口么?
  9. 我读经典系列(一)《我读先秦诸子》易中天教授讲稿的简要摘录
  10. MindMapper的使用技巧分享