bzoj1065【Noi2008】奥运物流
题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1065
给一棵基环树,每个点i的权值=ci+k*∑son[i],修改至多m个点的父亲使1号点权值最大
sol: 首先因为转移的式子形成了一个环,所以1号点的权值需要手推QAQ
对于一个点,其贡献为ci*k^dep*(1+k^len+k^2len+...),因为每个点更新到1后还要在环上反复更新
所以R1=(∑(ci*k^dep[i]),(i from 1 to n))/(1-k^len)
还是没法做啊QAQ,必须要拆环
枚举环长为len,将1的后继设为断点,就可以只考虑分子啦QwQ,然后对于每个环长做dp取max即可
对于每次修改,易证将其后继设为1最优
考虑dp,f[i][j][k]表示以i为根的子树修改了j次,i到1的距离为k,即可得到状态转移方程
f[i][j][dep]=max {∑ max(f[v][J][dep+1],f[v][J][1])+(c[i]*(k^dep)),v为i儿子,∑J=j;//i不向根连边
∑ max(f[v][J][2],f[v][J][1])+(c[i]*k),v为i儿子,∑J=j; }//i向根连边
P.S.注意特判i=1的情况
然而这样复杂度依然爆炸QAQ
观察右面的式子,首先先简化方程,令g[i][j][k]=max(f[i][j][k+1],f[i][j][1])
则右面的式子可以理解为,对于j,选择一种划分方案,使∑ g[i][J][k],(∑J=j) 最大
即可用多重背包优化该方程,把g看做物品,cost=J,val=g[i][J][k]
P.S.并不是很明白为什么用邻接表遍历就GG了QAQ,直接暴力扫&判定才过QAQ
#include<iostream>
#include<algorithm>
#include<cstdio>
#include <cstring>
using namespace std;
const int Mx = ;
double f[Mx][Mx][Mx],g[Mx][Mx][Mx];
double C[Mx],F[Mx],K[Mx],ans;
int n,m,fa[Mx];
void Dp(int x,int dep)
{
for(int v=;v<=n;v++) if(fa[v]==x) Dp(v,dep+);
for(int d=min(,dep);d<=dep;d++)//不修改后继
{
memset(F,,sizeof(F));
for(int v=;v<=n;v++)//多重背包优化
if(fa[v]==x)
for(int j=m;j>=;j--)
for (int k=j;k>=;k--)
F[j]=max(F[j],F[k]+g[v][j-k][d]);
for(int j=;j<=m;j++) f[x][j][d]=F[j]+C[x]*K[d];
}
if(dep>)//将其后继结点修改为1
{
memset(F,,sizeof(F));
for(int v=;v<=n;v++)
if(fa[v]==x)
for(int j=m;j>=;j--)
for(int k=j;k>=;k--)
F[j]=max(F[j],F[k]+g[v][j-k][]);
for(int j=;j<=m;j++) f[x][j][]=F[j-]+C[x]*K[];
}
for(int j=;j<=m;j++)
for(int d=;d<dep;d++)
g[x][j][d]=max(f[x][j][d+],f[x][j][]);
} int main()
{
cin>>n>>m>>K[];
K[]=; for (int i=;i<=n;i++) K[i]=K[i-]*K[];
for(int i=;i<=n;i++)
{
int x;scanf("%d",&x);
fa[i]=x;
}
for(int i=;i<=n;i++) cin>>C[i];
for(int now=fa[],len=;now!=;now=fa[now],len++)//枚举环长
{
memset(f,,sizeof(f));
memset(g,,sizeof(g));
int tmp=fa[now]; double sum=; fa[now]=;//断环
for(int v=;v<=n;v++) if(fa[v]==) Dp(v,);
memset(F,,sizeof(F));
for(int v=;v<=n;v++)//因为1的儿子未修改,所以用f而不是g更新F
if(fa[v]==)
for(int j=m;j>=;j--)
for(int k=j;k>=;k--)
F[j]=max(F[j],F[k]+f[v][j-k][]);
for(int j=;j<m;j++) sum=max(sum,F[j]);
if(tmp==) sum=max(sum,F[m]);//若now的fa为1,则断环未修改
ans=max(ans,(sum+C[])/(-K[len]));//更新答案
fa[now]=tmp;//还原父结点
}
printf("%.2lf\n",ans);
return ;
}
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 ...
- 【BZOJ1065】【NOI2008】奥运物流(动态规划)
[BZOJ1065][NOI2008]奥运物流(动态规划) 题面 BZOJ 洛谷 题解 先不考虑环的情况,于是变成了一棵树. 这样子我们答案的贡献是\(\sum_{i=1}^nC_i\times k^ ...
- 题解 Sue的小球/名次排序问题/方块消除/奥运物流
Sue的小球 名次排序问题 方块消除 奥运物流 Sue的小球 题目大意 有 \(n\) 个小球在下落,初始位置 \((x_i,y_i)\),下落速度为 \(v_i\).你初始位置在 \(x_0\),速 ...
- 【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 ...
随机推荐
- SQL2005中使用backup、restore来备份和恢复数据库
在SQL2005数据库中利用SQL语句进行数据备份与还原: 备份backup:backup database 数据库名称 tO disk = 备份路径例:BACKUP DATABASE test TO ...
- 接口接收gzip压缩数据并解压
asp.net 接收前端gzip 压缩后的数据,接收端需要进行解压 public string GetResponseBody(HttpWebResponse response) { string r ...
- navicate连接mysql
1. 打开navicate,选择连接 2. 编辑连接属性 编辑完成之后,连接成功.
- DRM 简介
首先,我们对和DRM 相关的一些概念进行介绍. Buffer: 对于RAC 数据库,当一个数据块被读入到buffer cache后,我们就称其为buffer , cache fusion 会将这个bu ...
- glob - 形成路径名称
描述 (DESCRIPTION) 很久以前 在 UNIX V6 版 中 有一个 程序 /etc/glob 用来 展开 通配符模板. 不久以后 它 成为 shell 内建功能. 现在 人们 开发了 类似 ...
- metasploit-shellcode生成
0x00 安装metasploit $ curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/t ...
- BXS入门赛部分writeup
pwn1 盲打(笑) 前言:没有听鱼哥的话,事先没有装好环境,于是开始没做出来,然后全程在装pwntools,经过一番努力,失败了0.0 最终在网上搜了一段python socket连接脚本,终于可 ...
- scanf函数详解
函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]);scanf()函数是通用终端格式化输入函数,它从标准输入设备(键 ...
- java在线聊天项目0.7版 连接多个客户端问题,开启多个客户端后服务器端只接收到一个 对各种异常的补充处理
问题的原因是 while(connected) { String str=dis.readUTF(); System.out.println(str); } 不断循环执行,一直在死循环获取socket ...
- CS193p Lecture 10 - Multithreating, UIScrollView
Multithreating(多线程) 网络请求例子: NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithStrin ...