P4322 [JSOI2016]最佳团体(分数规划&树上背包)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P4322 [JSOI2016]最佳团体(分数规划&树上背包)相关的知识,希望对你有一定的参考价值。

P4322 [JSOI2016]最佳团体(分数规划&树上背包)

分数问题,首先转为二分性判定问题。

每个结点的值变为: v a l i = a i − m i d × b i val_i=a_i-mid\\times b_i vali=aimid×bi

然后此题转化为一棵树。

f ( i , j ) f(i,j) f(i,j) i i i为结点的子树选择 j j j个的最大值。

对于二分的 m i d mid mid f ( i , k + 1 ) ≥ 0 f(i,k+1)\\ge 0 f(i,k+1)0则满足要求。

时间复杂度: O ( l o g M n 2 ) O(logM n^2) O(logMn2)

// Problem: P4322 [JSOI2016]最佳团体
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P4322
// Memory Limit: 250 MB
// Time Limit: 1000 ms
// Date: 2021-08-23 14:07:05
// --------by Herio--------

#include<bits/stdc++.h>
using namespace std;
#define cmax(a,b) a=a>b?a:b
inline int read(){
	int x=0,f=1;
	char c=getchar();
	while(!isdigit(c)&&c!='-') c=getchar();
	if(c=='-') f=-1;
	while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
	return x*f;
}
const int N=2502;
struct edge{
	int to,next;
}e[N<<1];
const float ex=1e-4;
int tot,k,n,h[N],sz[N];
float dp[N][N],d[N],p[N],s[N];
inline void add(int x,int y){
	e[++tot]=(edge){y,h[x]};
	h[x]=tot;
}
void dfs(int x,int fa){
	sz[x]=1,dp[x][1]=d[x];
	for(register int i=h[x];i;i=e[i].next){
		int y=e[i].to;
		if(y==fa) continue;
		dfs(y,x);
		sz[x]+=sz[y];
		for(register int j=min(k+1,sz[x]);j;j--){
			int minn=min(j-1,sz[y]);
			for(register int z=1;z<=minn;z++){
				cmax(dp[x][j],dp[y][z]+dp[x][j-z]);
			}
		}
	}
}
inline bool check(float m){
	for(register int i=1;i<=n;i++){
		d[i]=p[i]-s[i]*m;
	}
	for(register int i=0;i<=n;i++){
		for(register int j=1;j<=k+1;j++){
			dp[i][j]=-2147483647;
		}
	}
	dfs(0,-1);
	return dp[0][k+1]>=0;
}
int main(){
	cin>>k>>n;
	float l=0,r=0;
	for(register int i=1;i<=n;i++){
		s[i]=read(),p[i]=read();
		cmax(r,p[i]); 
		add(read(),i);
	}
	while(r-l>ex){
		float mid=(l+r)/2;
		if(check(mid)){
			l=mid;
		}else{
			r=mid;
		}
	}
	printf("%.3f",l);
	return 0;
}

以上是关于P4322 [JSOI2016]最佳团体(分数规划&树上背包)的主要内容,如果未能解决你的问题,请参考以下文章

[JSOI 2016] 最佳团体(树形背包+01分数规划)

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

bzoj 4753: [Jsoi2016]最佳团体01分数规划+二分+树上背包

BZOJ.4753.[JSOI2016]最佳团体(01分数规划 树形背包DP)

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

解题:JSOI 2016 最佳团体