洛谷P4383 [八省联考2018]林克卡特树

题目描述
题解

题目可以转化一下,就是要在原树中选出 k + 1 k+1 k+1 条不相交的链使得其权值和最大。

考虑暴力 dp \text{dp} dp f [ u ] [ i ] [ 0 / 1 / 2 ] f[u][i][0/1/2] f[u][i][0/1/2] 表示 u u u 子树选了 i i i 条链, u u u 没有连边/有一条出边/有两条出边的最大值,可惜是 O ( n k 2 ) O(nk^2) O(nk2) 的过不去。

稍微感性理解一下,如果设选出 x x x 的答案为 f ( x ) f(x) f(x) 的话,那应该是个上凸壳,所以可以采用 wqs \text{wqs} wqs 二分把第二维消掉,具体来说就是选每条链的时候就 − m i d -mid mid ,然后记录一下取最大值的时候选了多少条链即可。效率 O ( n l o g c ) O(nlogc) O(nlogc) 。(感觉写了上一篇就很套路了)

代码
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N=3e5+5,M=N<<1;
const LL F=-2e18;LL c;
int n,k,hd[N],V[M],W[M],nx[M],t;
struct O{LL x;int y;}A,f[N][3],g[3];
bool operator < (O A,O B){
	return A.x!=B.x?A.x<B.x:A.y>B.y;
}
O operator + (O A,O B){
	return (O){A.x+B.x,A.y+B.y};
}
void add(int u,int v,int w){
	nx[++t]=hd[u];V[hd[u]=t]=v;W[t]=w;
}
void dfs(int u,int fr){
	f[u][0]=(O){0,0};f[u][1]=(O){-c,1};f[u][2]=(O){F,0};
	for (int v,i=hd[u];i;i=nx[i]){
		if ((v=V[i])==fr) continue;dfs(v,u);
		for (int j=0;j<3;j++) g[j]=f[u][j];
		O ax=max(f[v][0],max(f[v][1],f[v][2]));
		f[u][0]=max(f[u][0],g[0]+ax);
		f[u][1]=max(f[u][1],g[1]+ax);
		f[u][1]=max(f[u][1],g[0]+f[v][1]+(O){W[i],0});
		f[u][2]=max(f[u][2],g[2]+ax);
		f[u][2]=max(f[u][2],g[1]+f[v][1]+(O){c+W[i],-1});
	}
}
int main(){
	cin>>n>>k;k++;LL l,r=0;
	for (int i=1,u,v,w;i<n;i++)
		scanf("%d%d%d",&u,&v,&w),
		add(u,v,w),add(v,u,w),r+=abs(w);
	l=-r;while(l<r){
		c=(l+r)>>1,dfs(1,0);
		A=max(f[1][0],max(f[1][1],f[1][2]));
		if (A.y>k) l=c+1; else r=c;
	}
	c=l;dfs(1,0);
	cout<<max(f[1][0],max(f[1][1],f[1][2])).x+c*k<<endl;
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值