思路借鉴 寻宝游戏。
对于换根到 i 就相当于去掉一个点 i−1,再加上点 i。
然后样例T了。
好像毛病挺多
#include <bits/stdc++.h>
#define ll long long
#define rll register ll
#define cll const ll
#define N 1000005
using namespace std;
inline ll read()
{
rll x=0;bool f=1;register char c=getchar();
while(c<48||c>57){if(c=='-') f=0;c=getchar();}
while(c>=48&&c<=57){x=x*10+(c^48);c=getchar();}
return f?x:-x;
}
inline void write(ll x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+48);
}
cll n=read(),k=read(),t=log(n)/log(2)+1;
ll m=read(),ts,idx,ans,d[N],v[N],h[N],e[N],ne[N],to[N],dfn[N],dis[N],f[N][25];
queue<ll> q;
set<ll> p;
set<ll>::iterator it1,it2,it3,it4;
inline void add(ll x,ll y,ll z){v[++idx]=y,e[idx]=z,ne[idx]=h[x],h[x]=idx;}
inline void dfs(ll x,ll F)
{
dfn[x]=++ts,to[ts]=x;
for(rll i=h[x];~i;i=ne[i])
{
cll y=v[i];
if(y!=F) dfs(y,x);
}
}
inline void bfs()
{
d[1]=1,q.push(1);
while(!q.empty())
{
cll x=q.front();q.pop();
for(rll i=h[x];~i;i=ne[i])
{
cll y=v[i];
if(d[y]) continue;
d[y]=d[x]+1;
dis[y]=dis[x]+e[i];
f[y][0]=x;
for(rll j=1;j<=t;j++)
f[y][j]=f[f[y][j-1]][j-1];
q.push(y);
}
}
}
inline ll LCA(ll x,ll y)
{
if(d[x]>d[y]) swap(x,y);
for(rll i=t;i>=0;i--)
if(d[f[y][i]]>=d[x]) y=f[y][i];
if(x==y) return x;
for(rll i=t;i>=0;i--)
if(f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
return f[x][0];
}
inline ll getdis(ll x,ll y){return dis[x]+dis[y]-dis[LCA(x,y)]*2;}
inline void pushin(ll x)
{
p.insert(dfn[x]);
it1=p.lower_bound(dfn[x]);
it2=it1,it3=it1,it4=p.end(),it4--;
if(it2!=p.begin()) it2--;
if(it3!=it4) it3++;
if(it1==p.begin()) ans+=getdis(x,to[*it3]);
else if(it1==p.end()) ans+=getdis(x,to[*it2]);
else ans+=getdis(x,to[*it2])+getdis(x,to[*it3])-getdis(to[*it2],to[*it3]);
}
inline void del(ll x)
{
it1=p.lower_bound(dfn[x]);
it2=it1,it3=it1,it4=p.end(),it4--;
if(it2!=p.begin()) it2--;
if(it3!=it4) it3++;
p.erase(dfn[x]);
if(it1==p.begin()) ans-=getdis(x,to[*it3]);
else if(it1==it4) ans-=getdis(x,to[*it2]);
else ans-=getdis(x,to[*it2])+getdis(x,to[*it3])-getdis(to[*it2],to[*it3]);
}
int main()
{
memset(h,-1,sizeof h);
for(rll i=2;i<=n;i++)
{
cll x=read(),y=read(),z=read();
add(x,y,z),add(y,x,z);
}
dfs(1,0),bfs();
for(rll i=1,x;i<=k;i++)
x=read(),pushin(x);
for(rll i=2;i<=n;i++)
{
if(i>1) del(i-1);
pushin(i);
write(ans),putchar('\n');
}
return 0;
}