题意: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】奥运物流的更多相关文章

  1. bzoj 1065: [NOI2008] 奥运物流

    1065: [NOI2008] 奥运物流 Description 2008北京奥运会即将开幕,举国上下都在为这一盛事做好准备.为了高效率.成功地举办奥运会,对物流系统 进行规划是必不可少的.物流系统由 ...

  2. 【洛谷】P4202 [NOI2008]奥运物流

    [洛谷]P4202 [NOI2008]奥运物流 感觉有点降智 首先设环长为\(len\),很容易推导出 \[ R(1) = \frac{\sum_{i = 1}^{N} C_{i} k^{dep[i] ...

  3. 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 ...

  4. [NOI2008]奥运物流

    题目 洛谷 BZOJ 做法 单环有向图毒瘤题 不考虑环和改变后继:\(\sum\limits{i=1}^n C_i\cdot K^{dep(i)}\) 考虑环无穷等比求极m:\(R(1)=\sum\l ...

  5. 【BZOJ1065】【NOI2008】奥运物流(动态规划)

    [BZOJ1065][NOI2008]奥运物流(动态规划) 题面 BZOJ 洛谷 题解 先不考虑环的情况,于是变成了一棵树. 这样子我们答案的贡献是\(\sum_{i=1}^nC_i\times k^ ...

  6. 题解 Sue的小球/名次排序问题/方块消除/奥运物流

    Sue的小球 名次排序问题 方块消除 奥运物流 Sue的小球 题目大意 有 \(n\) 个小球在下落,初始位置 \((x_i,y_i)\),下落速度为 \(v_i\).你初始位置在 \(x_0\),速 ...

  7. 【BZOJ 1065】【Vijos 1826】【NOI 2008】奥运物流

    http://www.lydsy.com/JudgeOnline/problem.php?id=1065 https://vijos.org/p/1826 好难的题啊TWT ∈我这辈子也想不出来系列~ ...

  8. BZOJ 1065 奥运物流

    http://www.lydsy.com/JudgeOnline/problem.php?id=1065 思路:由于n个点,有n条边,因此由根就会引出一个环,我们枚举环的长度,在那个长度断开,我们假设 ...

  9. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

随机推荐

  1. leetcode 4.两个排序数组的中位数

    题目: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 nums1 和 nums ...

  2. 机器学习(3)- 学习建议<误差出现如何解决?>

    根据Andrew Ng在斯坦福的<机器学习>视频做笔记,已经通过李航<统计学习方法>获得的知识不赘述,仅列出提纲. 1 学习建议 误差太大,如何改进? 使用更多的训练样本→解决 ...

  3. python基础面试题整理---从零开始 每天十题(02)

    书接上回,我们继续来说说python的面试题,我在各个网站搜集了一些,我给予你们一个推荐的答案,你们可以组织成自己的语言来说出来,让我们更好的做到面向工资编程 一.Q:说说你对zen of pytho ...

  4. 关于js作用域问题详解

    执行上下文 函数表达式和函数声明 1. console.log(a); // ReferenceError: a is not defined // ReferenceError(引用错误)对象表明一 ...

  5. Bootstrap历练实例:块级按钮

    <!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...

  6. C++系统学习之二:字符串

    上一篇文章主要学习的是C++的基本类型,它们是C++语言直接定义的,它们体现了计算机硬件本身具备的能力.而本篇文章将主要学习内置类型之外的标准库所定义的类型,分别是string和vector,此外还将 ...

  7. CF-1100 E Andrew and Taxi

    CF-1100E Andrew and Taxi https://codeforces.com/contest/1100/problem/E 知识点: 二分 判断图中是否有环 题意: 一个有向图,每边 ...

  8. 【数位dp】bzoj1799: [Ahoi2009]self 同类分布

    各种奇怪姿势的数位dp Description 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数. Sample Input 10 19 Sample Output 3 HINT [约束条 ...

  9. [POJ] 3362 Telephone Lines

    Telephone Lines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7978 Accepted: 2885 Descr ...

  10. (56)zabbix Screens视图配置

    screen翻译成中文为“屏幕”,在超市.单位等等地方都比较常见到监控视频,视频上有多块小视频,实际上zabbix screen和这个功能类似.你可以设置多个screen,每个screen可以显示特定 ...