【BZOJ1065】【NOI2008】奥运物流(动态规划)
【BZOJ1065】【NOI2008】奥运物流(动态规划)
题面
题解
先不考虑环的情况,于是变成了一棵树。
这样子我们答案的贡献是\(\sum_{i=1}^nC_i\times k^{dep[i]}\)
其中\(dep\)是点的深度
考虑环的影响,显然是\(R(1)\)的贡献沿着环反复加在环上,假设环的长度为\(len\)
那么,答案就是\(R(1)\sum_{i=1}^{\infty}K^{i\times len}\),
等比数列求和一下,所以答案就是
\]
这样子就可以得到\(10\)分啦。
我们考虑一下如果一个点更改后继,我们显然要让他的深度最小
既然后继可以随意更改,那么它显然接到\(1\)的后面。
因此,一个点如果修改后继,那么它的后继一定是\(1\)
同时,因为\(K\lt 1\),所以我们尽可能让环的大小最小。
既然每次修改的结果一定是将后继修改为\(1\)
那么,我们可以考虑一下\(dp\)
设\(f[i][j]\)表示\(i\)的子树中有\(j\)个点的后继修改为\(1\)的子树最大贡献
但是这样子我们似乎没法将\(i\)这个点的贡献转移给\(1\)
因为我们并不知道\(i\)的深度。
所以我们增加一维\(f[i][j][k]\)表示以\(i\)为根的子树中,\(j\)个点的后继修改为\(i\),
其中\(i\)号点到\(1\)的距离是\(k\)的最大贡献
所以我们的转移有两种,一种是将\(i\)号点的后继修改为\(1\)号点
那么,它的所有儿子的深度要么是\(1\),也就是后继修改为了\(1\)
要么是\(2\),也就是没有修改后继
转移就是\(f[u][i][k]=C_u·K+\sum_vmax(f[v][j][1],f[v][j][2])\)
对于第二维是一个背包问题
如果不修改当前点的后继的话,它的所有儿子的深度要么是当前点加一,要么是\(1\)
\(f[u][i][k]=C_u·K^k+\sum_vmax(f[v][j][k+1],f[v][j][1])\)
但是这样子我们发现环还是对答案有影响
所以我们枚举一下环的长度,从对应的地方把它断开成为一棵树,
这样底下的分母的贡献唯一确定,只需要考虑树上的最大贡献了
此时也就是上面所述的\(dp\)了。
说起来好容易,写起来贼麻烦,我自己写WA到不知道哪里去了,最后照着别人打了一遍
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define MAX 65
vector<int> e[MAX];
int n,m,fa[MAX],S[MAX],top,deg[MAX];
double K,C[MAX],f[MAX][MAX][MAX],ans,pw[MAX],g[MAX][MAX];
int Cir[MAX];
void cmax(double &x,double y){if(y>x)x=y;}
void init()
{
for(int i=1;i<=n;++i)e[i].clear();
for(int i=1;i<=n;++i)
for(int j=0;j<=n;++j)
for(int k=0;k<=n;++k)f[i][j][k]=-1e18;
}
void predp(int u,int dep)
{
for(int i=0;i<=e[u].size();++i)
for(int j=0;j<=n;++j)g[i][j]=-1e18;
g[0][0]=0;
for(int i=0;i<e[u].size();++i)
{
int v=e[u][i];
for(int k=0;k<=m;++k)
for(int l=0;l<=k;++l)
cmax(g[i+1][k],g[i][l]+f[v][k-l][dep]);
}
}
void dfs(int u)
{
for(int i=0;i<e[u].size();++i)dfs(e[u][i]);
predp(u,2);
for(int i=0;i<=n;++i)
for(int j=1;j<=m;++j)
f[u][j][i]=C[u]*K+g[e[u].size()][j-1];
for(int i=0;i<=n;++i)
{
predp(u,i+1);
for(int j=0;j<=m;++j)
cmax(f[u][j][i],g[e[u].size()][j]+C[u]*pw[i]);
}
}
int main()
{
scanf("%d%d%lf",&n,&m,&K);pw[0]=1;
for(int i=1;i<=n;++i)pw[i]=pw[i-1]*K;
for(int i=1;i<=n;++i)scanf("%d",&fa[i]);
for(int i=1;i<=n;++i)scanf("%lf",&C[i]);
for(int i=fa[1],len=2;i!=1;i=fa[i],++len)
{
init();
for(int j=n;j>1;--j)
if(i!=j)e[fa[j]].push_back(j);
else e[1].push_back(j);
dfs(1);
ans=max(ans,f[1][m-(fa[i]!=1)][0]/(1-pw[len]));
}
printf("%.2lf\n",ans);
return 0;
}
【BZOJ1065】【NOI2008】奥运物流(动态规划)的更多相关文章
- bzoj 1065: [NOI2008] 奥运物流
1065: [NOI2008] 奥运物流 Description 2008北京奥运会即将开幕,举国上下都在为这一盛事做好准备.为了高效率.成功地举办奥运会,对物流系统 进行规划是必不可少的.物流系统由 ...
- 【洛谷】P4202 [NOI2008]奥运物流
[洛谷]P4202 [NOI2008]奥运物流 感觉有点降智 首先设环长为\(len\),很容易推导出 \[ R(1) = \frac{\sum_{i = 1}^{N} C_{i} k^{dep[i] ...
- 1065: [NOI2008]奥运物流 - BZOJ
Sample Input4 1 0.52 3 1 310.0 10.0 10.0 10.0Sample Output30.00 推荐题解:http://blog.csdn.net/whjpji/art ...
- [NOI2008]奥运物流
题目 洛谷 BZOJ 做法 单环有向图毒瘤题 不考虑环和改变后继:\(\sum\limits{i=1}^n C_i\cdot K^{dep(i)}\) 考虑环无穷等比求极m:\(R(1)=\sum\l ...
- 题解 Sue的小球/名次排序问题/方块消除/奥运物流
Sue的小球 名次排序问题 方块消除 奥运物流 Sue的小球 题目大意 有 \(n\) 个小球在下落,初始位置 \((x_i,y_i)\),下落速度为 \(v_i\).你初始位置在 \(x_0\),速 ...
- bzoj1065【Noi2008】奥运物流
题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1065 给一棵基环树,每个点i的权值=ci+k*∑son[i],修改至多m个点的父亲使1号点权值 ...
- 【BZOJ 1065】【Vijos 1826】【NOI 2008】奥运物流
http://www.lydsy.com/JudgeOnline/problem.php?id=1065 https://vijos.org/p/1826 好难的题啊TWT ∈我这辈子也想不出来系列~ ...
- BZOJ 1065 奥运物流
http://www.lydsy.com/JudgeOnline/problem.php?id=1065 思路:由于n个点,有n条边,因此由根就会引出一个环,我们枚举环的长度,在那个长度断开,我们假设 ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
随机推荐
- vscode eslint格式化配置
{ // vscode默认启用了根据文件类型自动设置tabsize的选项 "editor.detectIndentation": false, // 重新设定tabsize &qu ...
- 如何在makfile中查看变量的值
在makefile中查看变量的取值是多少应该是一个比较麻烦的问题,但是本大神自己研究出一个十分方便的方法.这个方法十分简单.现在介绍如下 如果在一个十分复杂庞大的makefile文件中,有个地方用到一 ...
- 二维DCT变换
DCT(Discrete Consine Transform),又叫离散余弦变换,它的第二种类型,经常用于信号和图像数据的压缩.经过DCT变换后的数据能量非常集中,一般只有左上角的数值是非零的,也就是 ...
- hbase中balance机制
HBase是一种支持自动负载均衡的分布式KV数据库,在开启balance的开关(balance_switch)后,HBase的HMaster进程会自动根据指定策略挑选出一些Region,并将这些Reg ...
- ES6的新特性(5)——数值的扩展
数值的扩展 二进制和八进制表示法 ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示. 0b111110111 === 503 // true 0o767 === ...
- CentOS 6.7下创建桌面快捷方式
CentOS 6.7下创建桌面快捷方式如下: 1 在桌面右键,选择“创建启动器" 2 在弹出菜单中,填写名称(显示在桌面上的名字),命令(可执行程序的路径) 3 点击弹出菜单左边的图标,选择 ...
- CSS布局之圣杯布局和双飞翼布局
其实圣杯布局和双飞翼布局实现的都是三栏布局,两边的盒子宽度固定,中间盒子自适应,也就是我们常说的固比固布局.它们实现的效果都是一样的,差别在于其实现的思想. 一.圣杯布局 html代码中,将重要的内容 ...
- 第17次Scrum会议(10/29)【欢迎来怼】
一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,冉华 小组照片 二.开会信息 时间:2017/10/29 17:20~17:42,总计22min.地点:东北师 ...
- mysql---增删用户
Mysql创建.删除用户 MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个 ; 表示一个命令语句结束): 1.新建用户 登录MYSQL: @>mysql - ...
- 使用git提交代码的一些小心得
1.不进行push不能运行的代码,如果需要提交,可以先注释,保证其他人pull时,可以得到能够正常使用的代码 2.每做完一件事,写一条描述,一次提交.不要等写了一堆代码,然后写一堆描述,这样如果需要查 ...