TLE55求助
查看原帖
TLE55求助
181437
cyfff楼主2021/2/4 09:56
#define ri register unsigned int
#define it unsigned int
using namespace std;
it n,m,hd[50005],nxt[100005],to[100005],vl[100005],cnt;
it vis[50005],a[50005],tl,ans,f[50005],sum;
it rd(){
	ri res=0,f=1;register char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar())res=(res<<1)+(res<<3)+ch-'0';
	return res*f;
}
void add(it x,it y,it z)
{nxt[++cnt]=hd[x];hd[x]=cnt;to[cnt]=y;vl[cnt]=z;}
void dfs(it x,it fa,it mn){
	for(ri i=hd[x];i;i=nxt[i])
	if(to[i]!=fa)dfs(to[i],x,mn);
	tl=0;for(ri i=hd[x];i;i=nxt[i])
	if(to[i]!=fa)a[++tl]=f[to[i]]+vl[i];
	sort(a+1,a+1+tl);
	for(ri i=tl;i&&a[i]>=mn;--i)--tl,++ans;
	memset(vis,0,sizeof(vis));
	for(ri i=1;i<=tl;++i)
	if(!vis[i]){
		it l=i+1,r=tl,zc=tl+1,md;
		while(l<=r){
			md=l+r>>1;
			if(a[i]+a[md]>=mn)r=(zc=md)-1;
			else l=md+1;
		}
		while(vis[zc]&&zc<=tl)++zc;
		if(zc<=tl)vis[i]=vis[zc]=1,++ans;
	}
	f[x]=0;for(ri i=tl;i;--i)
	if(!vis[i]){f[x]=a[i];return;}
}
int main(){
	n=rd();m=rd();
	it x,y,z;
	for(ri i=1;i<n;++i){
		x=rd();y=rd();z=rd();sum+=z;
		add(x,y,z);add(y,x,z);
	}
	for(x=0,y=sum/m;x<=y;){
		z=x+y>>1;
		ans=0;dfs(rand()%n+1,0,z);
		if(ans>=m)x=z+1;
		else y=z-1;
	}
	printf("%d",x-1);
	return 0;
}
2021/2/4 09:56
加载中...