TLE85求助
查看原帖
TLE85求助
353976
Yuzu_Soft楼主2023/5/2 16:22
#include<bits/stdc++.h>
#define pii pair<int,int>
using namespace std;
inline int read()
{
	int s=0,w=1;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-')
			w=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		s=(s<<3)+(s<<1)+(c^48);
		c=getchar();
	}
	return s*w;
}
inline void print(int x)
{
	if(x<0)
	{
		putchar('-');
		x=-x;
	}
	if(x>=10)
		print(x/10);
	putchar(x%10+'0');
	return;
}
int n,m,dep[300005],f[300005][20],mid,c[300005],a[300005],b[300005],sum[300005],cnt,ma;
vector<pii>vec[300005];
bool flag=false;
void dfs(int x,int fa)
{
	dep[x]=dep[fa]+1;
	f[x][0]=fa;
	for(int i=1;(1<<i)<=dep[x];i++)f[x][i]=f[f[x][i-1]][i-1];
	for(pii i:vec[x])
	{
		int u=i.first,v=i.second;
		if(u!=fa)
		{
			sum[u]=sum[x]+v;
			dfs(u,x);
		}
	}
}
int lca(int x,int y)
{
	if(dep[x]<dep[y])swap(x,y);
	while(dep[x]>dep[y])
	{
		int k=(int)log2(dep[x]-dep[y]);
		x=f[x][k];
	}
	if(x==y)return x;
	for(int i=17;i>=0;i--)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
	return f[x][0];
}
void dfs2(int x,int fa)
{
	for(pii i:vec[x])
	{
		int u=i.first,v=i.second;
		if(u!=fa)
		{
			dfs2(u,x);
			c[x]+=c[u];
			if(c[u]==cnt)if(v>=ma)flag=true;
		}
	}
}
int main()
{
//	freopen("P2680_9.in","r",stdin);
	n=read(),m=read();
	int l=0,r=0;
	for(int x,y,z,i=2;i<=n;i++)x=read(),y=read(),z=read(),vec[x].push_back({y,z}),vec[y].push_back({x,z}),r+=z;
	dfs(1,0);
//	printf("aya");
	for(int i=1;i<=m;i++)a[i]=read(),b[i]=read();
	while(l<r)
	{
//		printf("%d %d\n",l,r);
		mid=(l+r)/2;
		for(int i=1;i<=n;i++)c[i]=0;
		cnt=0;
		ma=0;
		flag=false;
		for(int i=1;i<=m;i++)
		{
			int fa=lca(a[i],b[i]);
			int len=sum[a[i]]+sum[b[i]]-sum[fa]*2;
			if(len>mid)
			{
				cnt++;
				ma=max(ma,len-mid);
				c[fa]-=2;
				c[a[i]]++;
				c[b[i]]++;
			}
		}
		if(cnt!=0)dfs2(1,0);
		else flag=true;
		if(flag)
		{
			r=mid;
		}
		else
		{
			l=mid+1;
		}
	}
	print(l);
	puts("");
	return 0;
}
 
2023/5/2 16:22
加载中...