此题数据过水
查看原帖
此题数据过水
170882
rrrrr楼主2020/10/25 21:38
#include<bits/stdc++.h>
using namespace std;
#define int long long
int p,n,m,head[300005],q[300005],line;
int lg[300005],la[300005],xx[300005],yy[300005],an,cnt,son[300005],fa[300005],dep[300005],siz[300005],top[300005],dis[300005],t[300005];
struct abc
{
	int v,w,nt;
} e[600005];
inline int read()
{
 	char c=getchar();int x=0;bool f=0;
    for(;!isdigit(c);c=getchar())f^=!(c^45);
    for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48);
    if(f)x=-x;return x;
}
void add(int u,int v,int w)
{
	e[++cnt].v=v;
	e[cnt].w=w;
	e[cnt].nt=head[u];
	head[u]=cnt;
}
void dfs1(int x,int f,int deep,int dce)
{
	dis[x]=dce;
	dep[x]=deep;
	fa[x]=f;
	siz[x]=1;
	int ms=-1;/*maxson*/
	for(int i=head[x];i;i=e[i].nt)
	{
		if(e[i].v==f)
		continue;
		q[e[i].v]=e[i].w;
		dfs1(e[i].v,x,deep+1,dce+e[i].w);
		siz[x]+=siz[e[i].v];
		if(siz[e[i].v]>ms)son[x]=e[i].v,ms=siz[e[i].v];
	}
}
void dfs2(int x,int tf/*topfather*/)
{
	top[x]=tf;
	if(!son[x]) return;
	dfs2(son[x],tf);
	for(int i=head[x];i;i=e[i].nt)
	{
		if(e[i].v==fa[x]||e[i].v==son[x])continue;
		dfs2(e[i].v,e[i].v);
	}
}
inline int lca(int x,int y)
{
    while(top[x]!=top[y])
    {
        if(dep[top[x]]<dep[top[y]]) swap(x,y);
        x=fa[top[x]];
    }
    return dep[x]<dep[y]?x:y;
}
void dfp(int f,int x)
{
	for(int i=head[x];i;i=e[i].nt)
	{
		if(e[i].v==f)
		continue;
		dfp(x,e[i].v);
		t[x]+=t[e[i].v];
	}
	if(t[x]==p) an=max(an,q[x]);
}
bool check(int mid)
{
	an=0,p=0;
	memset(t,0,sizeof(t));
	for(int i=1;i<=m;i++)
	{
		if(lg[i]>mid)
		{
			//t[fa[la[i]]]-=1;
			t[la[i]]=-2;//应为+=-2
			t[xx[i]]++;
			t[yy[i]]++;
			p++;
		}
	}
	dfp(-1,1);
	if(line-an<=mid)
	return true;
	return false;
}
signed main()
{
//	freopen("o.in","r",stdin);
//	freopen("o.out","w",stdout);
	n=read(),m=read();
	for(int i=1;i<=n-1;i++)
	{
		int x=read(),y=read(),z=read();
		add(x,y,z);
		add(y,x,z);
	}
	dfs1(1,0,1,0);
	dfs2(1,1);
	for(int i=1;i<=m;i++)
	{
		xx[i]=read(),yy[i]=read();
		la[i]=lca(xx[i],yy[i]);
		lg[i]=(dis[xx[i]]+dis[yy[i]])-2*dis[la[i]];
		line=max(line,lg[i]);
	}
	int l=0,r=0x3f3f3f3f3f,ans;
	while(l<=r)
	{
		int mid=(l+r)>>1;
		if(check(mid))ans=mid,r=mid-1;
		else l=mid+1;
	}
	cout<<ans;
}

这样的代码竟然有95分???

2020/10/25 21:38
加载中...