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 ...
随机推荐
- 使用 Azure 创建存储和检索文件
本指南将以循序渐进的方式帮助您使用 Azure 将文件存储到云中.我们将逐一介绍如何创建存储账户.创建容器.上传文件.检索文件和删除文件.在本教程中完成的所有操作均符合 1 元试用条件. 本指南将以循 ...
- JavaScript实现的水果忍者游戏,支持鼠标操作
智能手机刚刚普及时,水果忍者这款小游戏可谓风靡一时.几年过去了,现在,让我们用纯JavaScript来实现这个水果忍者游戏,就算是为了锤炼我们的JavaScript开发技能吧. 大家可以通过这个链接在 ...
- 微信程序开发系列教程(四)使用微信API创建公众号自定义菜单
大家可能经常看到一些微信公众号具有功能强大的自定义菜单,点击之后可以访问很多有用的功能. 这篇教程就教大家如何动手做一做. 这个教程最后实现的效果是:创建一个一级菜单"UI5", ...
- CSS的相对定位和绝对定位
relative的意思就是相对自己的一开始的位置进行的定位.如图: 但是这个元素的本身边距不变,还在原来位置 absolute的意思就是 如果它的父元素设置了除static之外的定位,比如pos ...
- git - GNU 交互工具
语法 git [options] [path1] [path2] gitps [options] gitview [options] filename 注意 GIT 包 的 主要 配置文件 是 .gi ...
- 火狐浏览器返回不加载JS
火狐浏览器 go(-1),返回后不加载JS,谷歌会加载. 总结: Firefox和Safari在back时不会触发load, ready事件! 解决方法: $(window).unload(funct ...
- Mathematics-基础:散列函数
一,概念: 散列(HASH)函数H也称哈希函数.是典型的多到一的函数,其输入为一可变长x(可以足够的长),输出一固定长的串h(一般为128位.160位,比输入的串短),该串h被称为输入x的Hash值. ...
- 精选30道Java笔试题附答案分析
精选30道Java笔试题解答 都是一些非常非常基础的题,是我最近参加各大IT公司笔试后靠记忆记下来的,经过整理献给与我一样参加各大IT校园招聘的同学们,纯考Java基础功底,老手们就不用进来了,免得笑 ...
- Java——舞动的排序
一.冒泡排序: http://v.youku.com/v_show/id_XMzMyOTAyMzQ0.html //冒泡排序 public class Bubbling { public static ...
- 二分查找算法java
二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元 ...