BZOJ4753: [Jsoi2016]最佳团体(分数规划+树上背包)

标签:题解

阅读体验

BZOJ题目链接 洛谷题目链接

具体实现

看到分数和最值,考虑分数规划

我们要求的是一个\(\dfrac{\sum P_i}{\sum S_i}\)最大对吧,考虑二分一个答案\(mid\)

那么就会有合法条件\(\dfrac{\sum P_i}{\sum S_i}\ge mid\),化简一下:\(\sum{(P_i-S_i×mid)}\ge 0\)

所以每次二分一个\(mid\)之后得到一个新数组v[i]=P[i]-S[i]×mid,我们跑背包\(check\)它最后是否大于等于\(0\)就可以了,因为有约束条件,所以把树建出来跑树上背包

dp[i][j]表示\(i\)节点选了\(j\)个凑出的\(v\)的最大值,我们最后就只要判断dp[0][K+1]>=0就可以啦

等一下!

这个\(dp\)的转移看上去向\(n^2\)的啊,再乘上\(Dfs\)的\(n\)的复杂度不就复杂度假了吗

其实不然,总体来看,每一对节点的\(dp\)状态只会在他们的\(Lca\)处被转移一次,想一想为什么(我想了挺久),所以复杂度就是\(n^2\)的啦

然而它还是卡常啊,最后\(Junlier\)就卡了很久,终于\(988ms\)卡过去了。。。

代码

#include<bits/stdc++.h>
#define il inline
#define rg register
#define ldb double
#define lst long long
#define rgt register int
#define N 2550
#define pb push_back
#define qw G[now][i]
using namespace std;
const lst Inf=1e18;
const ldb eps=1e-4;
il int read()
{
int s=0,m=0;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')m=1;ch=getchar();}
while( isdigit(ch))s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return m?-s:s;
} int K,n,Dex;
int siz[N];
struct LJL{int S,P,fa;}ljl[N];
ldb v[N],tmp[N],dp[N][N],Ans;
vector<int> G[N]; il void Merge(rgt x,rgt y)
{
for(rgt i=0;i<=K+1;++i)tmp[i]=-Inf;
for(rgt i=1,up;i<=siz[x];++i)
{
up=min(K+1-i,siz[y]);
for(rgt j=1;j<=up;++j)
tmp[i+j]=max(tmp[i+j],dp[y][j]+dp[x][i]);
}for(rgt i=0;i<=K+1;++i)dp[x][i]=max(dp[x][i],tmp[i]);
} void Dfs(rgt now)
{
for(rgt j=0;j<=K+1;++j)dp[now][j]=-Inf;
dp[now][1]=v[now],siz[now]=1;
for(rgt i=0;i<G[now].size();++i)
Dfs(qw),Merge(now,qw),siz[now]+=siz[qw];
} il bool check(ldb lim)
{
for(rgt i=1;i<=n;++i)
v[i]=ljl[i].P-ljl[i].S*lim;
Dfs(0);return dp[0][K+1]>=0;
} int main()
{
K=read(),n=read();
for(rgt i=1;i<=n;++i)
{
ljl[i]=(LJL){read(),read(),read()};
G[ljl[i].fa].pb(i);
}ldb le=eps,ri=1e5,mid;
while(ri-le>eps)
{
mid=(le+ri)/2;
if(check(mid))Ans=mid,le=mid+eps;
else ri=mid-eps;
}return printf("%.3lf\n",Ans),0;
}

BZOJ4753: [Jsoi2016]最佳团体(分数规划+树上背包)的更多相关文章

  1. 【bzoj4753】[Jsoi2016]最佳团体 分数规划+树形背包dp

    题目描述 JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一位编号比他小的候选人Ri推荐.如果Ri=0则说明这个候选人是JYY自己看上的.为了 ...

  2. 【BZOJ】4753: [Jsoi2016]最佳团体 01分数规划+树上背包

    [题意]n个人,每个人有价值ai和代价bi和一个依赖对象ri<i,选择 i 时 ri 也必须选择(ri=0时不依赖),求选择k个人使得Σai/Σbi最大.n<=2500,ai,bi< ...

  3. bzoj4753: [Jsoi2016]最佳团体(分数规划+树形依赖背包)

    菜菜推荐的“水题”虐了我一天T T...(菜菜好强强qwq~ 显然是个分数规划题,二分答案算出p[i]-mid*s[i]之后在树上跑依赖背包,选k个最大值如果>0说明还有更优解. 第一次接触树形 ...

  4. bzoj4753[JSOI2016]最佳团体

    题意:01分数规划,但可选的数字之间存在森林形的依赖关系(可以认为0号点是个虚根,因为并不能选). 虽然有森林形的依赖关系,但还是可以套分数规划的思路,二分答案k,判断是否存在一个比值大于k的方案 即 ...

  5. BZOJ4753 JSOI2016最佳团体(分数规划+树形dp)

    看到比值先二分答案.于是转化成一个非常裸的树形背包.直接暴力背包的话复杂度就是O(n2),因为相当于在lca处枚举每个点对.这里使用一种更通用的dfs序优化树形背包写法.https://www.cnb ...

  6. LUOGU P4322 [JSOI2016]最佳团体(0/1分数规划+树形背包)

    传送门 解题思路 一道0/1分数规划+树上背包,两个应该都挺裸的,话说我常数为何如此之大..不吸氧洛谷过不了啊. 代码 #include<iostream> #include<cst ...

  7. BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划

    BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划 又是一道卡精度卡得我头皮发麻的题-- 题面(--蜜汁改编版) YL大哥是24OI的大哥,有一天,他想要从\(N\)个候选人中选 ...

  8. BZOJ_4753_[Jsoi2016]最佳团体_树形背包+01分数规划

    BZOJ_4753_[Jsoi2016]最佳团体_树形背包+01分数规划 Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人 ...

  9. 【BZOJ4753】最佳团体(分数规划,动态规划)

    [BZOJ4753]最佳团体(分数规划,动态规划) 题面 BZOJ Description JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号.每个候选人都由一 ...

随机推荐

  1. 【leetcode】1161. Maximum Level Sum of a Binary Tree

    题目如下: Given the root of a binary tree, the level of its root is 1, the level of its children is 2, a ...

  2. 进行移动端rem适配

    (function (designWidth, maxWidth) { var doc = document, win = window; var docEl = doc.documentElemen ...

  3. handy源码阅读(五):PollerBase类

    使用poll内核函数等待事件发生: struct PollerBase: private noncopyable { int64_t id_; int lastActive_; PollerBase( ...

  4. 最大 k 乘积问题 ( 经典区间DP )

    题意 : 设 NUM 是一个 n 位十进制整数.如果将 NUM 划分为 k 段,则可得到 k 个整数.这 k 个整数的乘积称为 NUM 的一个 k 乘积.试设计一个算法,对于给定的 NUM 和 k,求 ...

  5. 前向渲染使用重叠Reflection Capture 造成的反射通道接缝问题

    问题出现的条件: 使用UE4 4.16 使用Forward shading 使用多个Sphere Reflection Capture组件(有重叠的部分) 烘焙灯光后能看到明显的反射通道接缝 解决办法 ...

  6. Han Xin and His Troops

    Han Xin and His Troops 中国剩余定理 JAVA板子 /*中国剩余定理,根据公式需要求取大数的逆元*/ import java.math.BigInteger; import ja ...

  7. WebServices 实现跨应用程序进行通信和跨平台进行通信

    SOA ,即Service Oriented Architecture ,中文一般理解为面向服务的架构, 既然说是一种架构的话,所以一般认为 SOA 是包含了运行环境,编程模型, 架构风格和相关方法论 ...

  8. Java 中如何使用clone()方法克隆对象?

    java为什么要 对象克隆: 在程序开发时,有时可能会遇到以下情况:已经存在一个对象A,现在需要一个与A对象完全相同的B 对象,并对B 对象的属性值进行修改,但是A 对象原有的属性值不能改变.这时,如 ...

  9. Django项目执行时No Module Named ' ' 问题的解决情况

    出现这种问题的情况大致都是因为该模块未安装,使用 pip install xxx 进行安装,即可解决此类问题. 出现ModuleNotFoundError: No module named 'rest ...

  10. django中自定义404错误页面

    自定义404页面,如下5个步骤:1)使用自定义的404页面,必须在setting文件修改DEBUG = False(即关闭debug调试模式)2)必须在setting文件修改ALLOWED_HOSTS ...