之前貌似在hdu还是poj上写过这道题。
#include<stdio.h> #include<string.h> #include<algorithm> #include<set> #define maxn 100010 #define INF 0x7fffffff using namespace std; struct node{ int to,cost,next; }e[maxn*]; int n,m,u,v,c,logn,tot,time,x; ],head[maxn],dep[maxn],id[maxn],pos[maxn]; ]; bool flag[maxn]; long long ans,t; set<int> st; inline void insert(int u, int v, int c){ e[++tot].to=v; e[tot].cost=c; e[tot].next=head[u]; head[u]=tot; } inline void dfs(int u, int f, int d, int c){ pos[u]=++time; id[time]=u; dep[u]=d; fa[u][]=f; dis[u][]=c; ; i<=logn; i++) fa[u][i]=fa[fa[u][i-]][i-]; ; i<=logn; i++) dis[u][i]=dis[u][i-]+dis[fa[u][i-]][i-]; ; i=e[i].next) ,e[i].cost); } inline long long lca(int u, int v){ ; if (dep[u]>dep[v]) swap(u,v); while (dep[u]<dep[v]){ ; i--) if (dep[u]<dep[fa[v][i]]){ sum+=dis[v][i]; v=fa[v][i]; } sum+=dis[v][]; v=fa[v][]; } if (u==v) return sum; ; i--) if (fa[u][i]!=fa[v][i]){ sum+=dis[u][i]+dis[v][i]; u=fa[u][i]; v=fa[v][i]; } sum+=dis[u][]+dis[v][]; return sum; } int main(){ scanf("%d%d", &n, &m); logn=; <<logn)<n) logn++; tot=-; memset(head,-,sizeof(head)); ; i<n; i++){ scanf("%d%d%d", &u, &v, &c); insert(u,v,c); insert(v,u,c); } time=; dfs(,,,); st.insert(-INF); st.insert(INF); while (m--){ scanf("%d", &x); if (!flag[x]){ flag[x]=; int l=*--st.lower_bound(pos[x]), r=*st.upper_bound(pos[x]); st.insert(pos[x]); if (l !=-INF) ans+=lca(id[l],x); if (r != INF) ans+=lca(x,id[r]); if (l!=-INF && r!=INF) ans-=lca(id[l],id[r]); } else{ flag[x]=; st.erase(pos[x]); int l=*--st.lower_bound(pos[x]), r=*st.upper_bound(pos[x]); if (l!=-INF) ans-=lca(id[l],x); if (r!= INF) ans-=lca(x,id[r]); if (l!=-INF && r!=INF) ans+=lca(id[l],id[r]); } ){ int l=*++st.lower_bound(-INF), r=*--st.lower_bound(INF); t=lca(id[l],id[r]); } printf("%lld\n", ans+t); } ; }