WA0(喜)
查看原帖
WA0(喜)
380950
2020wty楼主2023/11/14 22:08
#include<iostream>
#include<cstdio>
#include<cstring>
#define re register int
#define il inline
using namespace std;
typedef long long ll;
const int N=3e5+10;
struct Node{
	ll v;
	int cnt;
}dp[N][3];
int n,tot,head[N],k,x,y,sz[N];
ll z,an;
struct node{
	int to,next;
	ll w;
}e[N<<1]; 
il void Add(int a,int b,ll c){
	tot++;
	e[tot].to=b;
	e[tot].next=head[a];
	e[tot].w=c;
	head[a]=tot;
}
Node operator + (Node a,Node b){
	Node c;
	c.v=a.v+b.v;
	c.cnt=a.cnt+b.cnt;
	return c;
}
bool operator > (Node a,Node b){
	if(a.v>b.v)return 1;
	if(a.v<b.v)return 0;
	return a.cnt<b.cnt;
}
il ll mx(ll A,ll B){return A>B?A:B;}
il void dfs(int now,int fa,ll ss){
	dp[now][0].v=dp[now][0].cnt=dp[now][1].cnt=dp[now][1].v=0;
	dp[now][2].v=-ss;
	dp[now][2].cnt=1;
	for(int i=head[now];i;i=e[i].next){
		int To=e[i].to;
		if(To!=fa){
			dfs(To,now,ss);
			Node cc;
			cc.v=dp[To][1].v+e[i].w-ss;
			cc.cnt=dp[To][1].cnt+1;
			if((dp[now][2]+dp[To][0])>dp[now][2])dp[now][2]=dp[now][2]+dp[To][0];
			if((dp[now][1]+cc)>dp[now][2])dp[now][2]=dp[now][1]+cc;
			if(dp[To][0]+dp[now][1]>dp[now][1])dp[now][1]=dp[To][0]+dp[now][1];
			cc.v+=ss;
			cc.cnt--;
			if((cc+dp[now][0])>dp[now][1])
				dp[now][1]=dp[now][0]+cc;
			if(dp[To][0]+dp[now][0]>dp[now][0])
				dp[now][0]=dp[To][0]+dp[now][0];
		}
	}
	Node cc;
	cc.v=dp[now][1].v-ss;
	cc.cnt=dp[now][1].cnt+1;
	if(cc>dp[now][0])
		dp[now][0]=cc;
	if(dp[now][2]>dp[now][0])
		dp[now][0]=dp[now][2];
}
il bool chck(ll k){
	memset(dp,0,sizeof(dp));
	memset(sz,0,sizeof(sz));
	dfs(1,0,k);
//	cout<<dp[1][0].v<<" "<<dp[1][0].cnt<<"dsflgj"<<k<<endl;
	return dp[1][0].cnt>=k;
}
int main(){
	scanf("%d%d",&n,&k);
	k++;
	for(re i=1;i<n;i++){
		scanf("%d%d%lld",&x,&y,&z);
		Add(x,y,z);
		Add(y,x,z);
	}
	ll l=-100000000ll,r=100000000ll;
	while(l<=r){
		ll mid=(l+r)>>1;
		if(chck(mid)){
			an=mx(an,dp[1][0].v+k*mid);
			l=mid+1; 
		}
		else r=mid-1;
	}
	printf("%lld",an);
	return 0;
}

恳请路过的佬好心帮忙看看蒟蒻快调死了

2023/11/14 22:08
加载中...