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 ...
随机推荐
- Verilog 参数化设计
为了提高模块的重复利用,关键就在于避免硬编码(hard literal),使模块参数化.参数化建模的好处是可以使代码清晰,便于后续维护和修改.只需要修改参数,不用修改其他代码就可以适用于不同的环境中. ...
- mongodb-3.2.8 单机复制集安装
规划: replSet 复制集名称: rs1 MongoDB数据库安装安装路径为:/usr/local/mongodb/ 复制集成员IP与端口: 节点1: localhost:28010 (默认的 ...
- 允许Java App(applet)粘贴方法
修改安全策略文件: "java.policy" JRE6的路径在:"C:\Program Files (x86)\Java\jre6\lib\security" ...
- 强化学习_PolicyGradient(策略梯度)_代码解析
使用策略梯度解决离散action space问题. 一.导入包,定义hyper parameter import gym import tensorflow as tf import numpy as ...
- ERROR 14856 --- [reate-882003853] com.alibaba.druid.pool.DruidDataSource : create connection error, url: jdbc:mysql://localhost:3306/xhb?useUnicode=true&characterEncoding=UTF-8, errorCode 1045, sta
ERROR 14856 --- [reate-882003853] com.alibaba.druid.pool.DruidDataSource : create connection error, ...
- 看paper的网址
http://www.arxiv-sanity.com/ https://scirate.com/ google搜cvpr open access.iccv open access
- Use-After-Free
0x00 UAF利用原理 uaf漏洞产生的主要原因是释放了一个堆块后,并没有将该指针置为NULL,这样导致该指针处于悬空的状态(这个指针可以称为恶性迷途指针),同样被释放的内存如果被恶意构造数据,就有 ...
- 基于Passthru的NDIS开发的个人理解
这几天对NDIS的学习,基本思路是:首先熟悉理论知识→然后下载一个例子进行研究→最后例子自己模仿扩展→最最后尝试自己写一个新的. Passthru是微软NDIS自己写的一个框架驱动,NDIS开发者可以 ...
- inotify+rsync sersync+rsync实时同步服务
中小型网站搭建-数据实时的复制-inotify/sersync inotify是一种强大的,细粒度的.异步的文件系统事件监控机制(软件),linux内核从2.6.13起,加入inotify支持,通过i ...
- 《linux设备驱动开发详解》笔记——11内存与IO访问
内存访问与映射是linux驱动常见操作,操作硬件时离不开内存的映射,本章比较重要. 11.1 CPU与内存.I/O 目前的嵌入式处理器,都不提供专门的I/O空间,而仅存在内存空间:各种外设寄存器都直接 ...