IOI 2005 Riv 河流 题解
题目传送门
题目大意: 给出一棵树,每个点有一些木材,除了根节点外(本身就是伐木场),你需要选 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 河流 题解相关推荐
- BZOJ 1812 IOI 2005 riv
1812: [Ioi2005]riv Time Limit: 10 Sec Memory Limit: 64 MB Submit: 566 Solved: 335 [Submit][Status] ...
- 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_{ ...
- 『树形DP』[IOI2005]Riv 河流
题目描述 题解 我们设f[x][j][k]f[x][j][k]f[x][j][k]表示运输完了以xxx为根的子树,iii的祖先jjj建立了伐木场,建立了kkk个伐木场的最小运输代价.由于题目中说明了0 ...
- 洛谷P3354 Riv河流 [IOI2005] 树型dp
正解:树型dp 解题报告: 传送门! 简要题意:有棵树,每个节点有个权值w,要求选k个节点,最大化∑dis*w,其中如果某个节点到根的路径上选了别的节点,dis指的是到达那个节点的距离 首先这个一看就 ...
- [IOI2005]Riv 河流
题目描述 几乎整个Byteland 王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一个村庄--B ...
- [IOI2005]Riv河流
题目链接:洛谷,BZOJ 前置知识:莫得 题解 直接考虑dp.首先想法是设状态 \(dp[u][i]\) 表示u的子树内建 \(i\) 个伐木场且子树内木头都运到某个伐木场的最小花费.发现这样的状态是 ...
- [LUOGU] P3354 [IOI2005]Riv 河流
题目描述 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一个村庄--名叫 ...
- 洛谷 P3354 [IOI2005]Riv 河流【树形dp】
... 题目: 题意: 分析: 代码: 题目: 传送门 题意: 给出一棵有nnn个节点的树,每条边有一个距离,每个点有一个权值 我们需要选出除根节点以外的kkk个节点,每个点的答案为该点的点权向上直到 ...
- P3354 [IOI2005]Riv 河流
树形dp,设f[i][j][k]表示第i个点的子树中选择j个点作为伐木场,而且k是建了伐木场的最浅的i的祖先的情况下,最小的收益. 这种题还要练一下,咕咕 然后转移可以n4方做. // luogu-j ...
最新文章
- android中setdate不是静态,为什么当setData()和setType()不起作用时,android intent的setDataAndType()工作正常?...
- junit5 与 surefire 对接使用
- 能跑java的服务器_一台java服务器可以跑多少个线程?
- WinPcap笔记(2):获取设备列表
- paip.提升用户体验与安全性----登录与权限流程总结
- Javascript的简单介绍,只作为个人笔记,不作为知识参考,如果想要学习,请找其他文章
- python复杂非线性方程_python – 如何解决Sympy中的非线性方程?
- 虚拟机搭建Windows2003步骤详解
- 【飞行器】基于matlab四旋翼飞行器飞行控制系统【含Matlab源码 1266期】
- java 中鼠标事件_Java中的鼠标事件
- 日期格式 Wed Oct 16 00:00:00 CEST 2020 转换
- 颜色拾取器和红蜻蜓截图
- 【软件测试】软件测试职业规划
- 耳机电声测试仪软件,CLIO 11电声测试仪
- html打印图片不显示不全,Word里图片显示全打印不全是怎么回事
- 零知识证明系列之二——Schnorr协议
- 线型(Line styles)的英文名称
- 《算法4》读书笔记(二)
- LeCun主讲!纽约大学《深度学习》2021课程全部放出
- 血杀英雄为什么不显示服务器,全新传奇网游《血杀英雄》今日下午2点 内测新服「英雄无双」强势开启...
热门文章
- 用计算机怎么求锐角三角函数值,用计算器求锐角三角函数值与由锐角三角函数值求锐角.doc...
- 计算机毕业设计之仿12306火车票购票平台
- 挂载zookeeper到文件系统 (mount zookeeper)
- BZOJ 4605: 崂山白花蛇草水 树套树 权值线段树套kdtree
- 为什么特斯拉Q2业绩能超预期?
- 模拟支付宝、淘宝登录1
- 苹果鼠标怎么充电_“智能”还是“多功能”?米物智能鼠标垫测评
- 互联网出海现在还是风口么?
- 我读经典系列(一)《我读先秦诸子》易中天教授讲稿的简要摘录
- MindMapper的使用技巧分享