P6058 [加油武汉]体温调查

written on 2022-05-23

两次二分,第一次二分内层套一个 k,以此来保证时间复杂度不超。

如果是一次二分,内层带一个有求lca的 m,这样就过不了,我实在是服了。。。

而且那样还有WA的,然而我对拍全过!

刷基础题,心态要刷没了。。

好了言归正传,这题的关键其实在于发现题目中隐含的最大值最小这个言外之意,这样就能够想到二分的做法了,当然两次二分,第二次二分中的 O(1) 求遍历两叶子间的所有点这个思想还是比较妙的。

#include<bits/stdc++.h>
#define N 200005
using namespace std;
typedef long long ll;
int n,k;
int tot,ver[N<<1],nxt[N<<1],head[N];
ll edge[N<<1];
void add_E(int x,int y,ll z){ver[++tot]=y,edge[tot]=z,nxt[tot]=head[x],head[x]=tot;}
int f[N][20],dep[N];
ll dis[N],s[N];
int m,leaf[N];
void dfs(int x)
{
	for(int i=1;i<=19;i++) f[x][i]=f[f[x][i-1]][i-1];
	bool flag=0;
	for(int i=head[x];i;i=nxt[i])
	{
		int y=ver[i];
		ll z=edge[i];
		if(y==f[x][0]) continue;
		flag=1;
		f[y][0]=x;
		dis[y]=dis[x]+z,dep[y]=dep[x]+1;
		dfs(y);
	}
	if(!flag) leaf[++m]=x;
}
int lca(int x,int y)
{
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=19;i>=0;i--) if(dep[f[x][i]]>=dep[y]) x=f[x][i];
	if(x==y) return x;
	for(int i=19;i>=0;i--) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
	return f[x][0];
}
ll D(int x,int y){return dis[x]+dis[y]-2*dis[lca(x,y)];}
bool check(ll w)
{
	int x=1;
	for(int i=1;i<=k;i++)
	{
		int l=x,r=m,res=-1;
		while(l<=r)
		{
			int mid=l+r>>1;
			if(s[mid]-s[x]+dis[leaf[x]]+dis[leaf[mid]]<=w) res=mid,l=mid+1;
			else r=mid-1;
		}
		if(res==-1) return 0;
		x=res+1;
		if(x>m) return 1;
	}
	return 0;/*
	int x=1,cnt=0;
	while(x<=m)
	{
		cnt++;
		int i=x;
		ll now=dis[leaf[x]];
		if(now*2<=mid) while(i<m)
		{
			now+=D(leaf[i],leaf[i+1]);
			if(now+dis[leaf[i+1]]>mid) break;
			i++;
		}
		x=i+1;
	}
	return cnt<=k;*/
}
int main()
{
//	freopen("1.in","r",stdin);
//	freopen("1.ans","w",stdout);
	scanf("%d%d",&n,&k);
	for(int i=1;i<n;i++)
	{
		int x,y;
		ll z;
		scanf("%d%d%lld",&x,&y,&z);
		add_E(x,y,z),add_E(y,x,z);
	}
	dep[1]=1,dfs(1);
//	reverse(leaf+1,leaf+1+m);
	s[1]=0;
	for(int i=2;i<=m;i++) s[i]=s[i-1]+D(leaf[i-1],leaf[i]);
	ll l=0,r=1e18,ans=0;
	while(l<=r)
	{
		ll mid=l+r>>1;
		if(check(mid)) r=mid-1,ans=mid;
		else l=mid+1;
	}
	printf("%lld\n",ans);
}
posted @   Freshair_qprt  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示