莫名其妙 15pts求助
#include<bits/stdc++.h>
using namespace std;
int n,m,ans,d;
vector<int> V[300001];
vector<int> W[300001];
int p[300001];
int sum[300001];
int deep[300001];
int l[300001];
int f[300001][31];
struct pj
{
int dis,u,v,lca;
}a[300001];
inline int read(int &x)//快速读入
{char ch=getchar();
int f=1;x=0;
while (ch<'0'||ch>'9') {if(ch=='-')f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
void dfs(int u,int fa)
{
for(int i=0;i<V[u].size();i++)
{
int v=V[u][i];
if(v==fa)
continue;
deep[v]=deep[u]+1;
f[v][0]=u;
p[v]=W[u][i];
sum[v]=sum[u]+W[u][i];
dfs(v,u);
}
}
int lca(int x,int y)
{
if(deep[x]<deep[y])
swap(x,y);
for(int i=d;i>=0;i--)
if(deep[x]-(1<<i)>=deep[y])
x=f[x][i];
if(x==y)
return x;
for(int i=d;i>=0;i--)
if(f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
x=f[x][0],y=f[y][0];
return x;
}
bool cmp(pj x,pj y)
{
return x.dis>y.dis;
}
void dfs1(int u,int fa)
{
for(int i=0;i<V[u].size();i++)
{
int v=V[u][i];
if(v==fa)
continue;
l[u]+=l[v];
dfs1(v,u);
}
}
bool check(int mid)
{
int cnt=0,maxn=-1;
memset(l,0,sizeof(l));
for(int i=1;i<=m;i++)
if(a[i].dis>mid)
{
cnt++;
l[a[i].u]++;
l[a[i].v]++;
l[a[i].lca]-=2;
}
dfs1(1,0);
for(int i=2;i<=n;i++)
if(l[i]==cnt)
maxn=max(maxn,p[i]);
if(maxn==-1)
return 0;
if(a[1].dis-maxn<=mid)
return 1;
return 0;
}
int main()
{
cin>>n>>m;
for(int i=1;i<n;i++)
{
int u,v,w;
read(u),read(v),read(w);
V[u].push_back(v);
V[v].push_back(u);
W[u].push_back(w);
W[v].push_back(w);
}
dfs(1,0);
while((1<<d)<=n)
d++;
for(int i=1;i<=d;i++)
for(int j=1;j<=n;j++)
f[j][i]=f[f[j][i-1]][i-1];
for(int i=1;i<=m;i++)
{
read(a[i].u),read(a[i].v);
a[i].lca=lca(a[i].u,a[i].v);
a[i].dis=sum[a[i].u]+sum[a[i].v]-2*sum[a[i].lca];
}
sort(a+1,a+n+1,cmp);
int l=0,r=1e9;
while(l<=r)
{
int mid=(l+r)/2;
if(check(mid))
{
ans=mid;
r=mid-1;
}
else
l=mid+1;
}
cout<<ans<<endl;
return 0;
}