70pts求助
查看原帖
70pts求助
331947
hegm楼主2023/11/13 20:48

rt,用的 set\text{set} 维护 dfn\text{dfn} 计算答案

#include<bits/stdc++.h>
#define N 100005
#define M 18
#define int long long
using namespace std;
int read()
{
	int x=0,f=1;char ch=getchar();
	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;
}
int n,m,num,dfn[N],ct,id[N];
long long ans;
struct fig
{
	int to,next,w;
}k[N*2];int head[N],tot,fa[18][N],dis[N],dep[N];
void add(int from,int to,int w)
{
	k[++tot].to=to;
	k[tot].w=w;
	k[tot].next=head[from];
	head[from]=tot;
}
void dfs(int now,int f)
{
	fa[0][now]=f;dep[now]=dep[f]+1;dfn[now]=++ct;id[ct]=now;
	for(int i=1;i<M;i++)fa[i][now]=fa[i-1][fa[i-1][now]];
	for(int i=head[now];i;i=k[i].next)
	{
		if(k[i].to==f)continue;
		dis[k[i].to]=dis[now]+k[i].w;
		dfs(k[i].to,now);
	}
}
int lca(int a,int b)
{
	if(dep[a]<dep[b])swap(a,b);
	for(int i=17;i>=0;i--)if(dep[fa[i][a]]>=dep[b])a=fa[i][a];
	if(a==b)return a;
	for(int i=17;i>=0;i--)if(fa[i][a]!=fa[i][b])a=fa[i][a],b=fa[i][b];
	return fa[0][a];
}
int get(int a,int b){return dis[a]+dis[b]-2*dis[lca(a,b)];}
set<int> s;bool vis[N];
signed main()
{
	n=read();m=read();
	for(int i=1,u,v,w;i<n;i++)
	{
		u=read();v=read();w=read();
		add(u,v,w);add(v,u,w);
	}
	dfs(1,0);
	for(int i=1,x;i<=m;i++)
	{
		x=dfn[read()];
		if(vis[id[x]])
		{
			num--;auto it=s.lower_bound(x);
			if(num)
			{
				set<int>::iterator a,b;
				++it;if(it!=s.end())ans-=get(id[x],id[*it]),a=it;
				else ans-=get(id[x],id[*s.begin()]),a=s.begin();
				--it;if(it!=s.begin())ans-=get(id[x],id[*(--it)]),b=it;
				else ans-=get(id[x],id[*(--s.end())]),b=--s.end();
				if(num>1)ans+=get(id[*a],id[*b]);
				s.erase(++it);
			}
			else s.erase(it);vis[id[x]]=0;
		}
		else
		{
			if(num)
			{
				auto it=s.upper_bound(x);
				set<int>::iterator a,b;
				if(it!=s.end())ans+=get(id[x],id[*it]),a=it;
				else ans+=get(id[x],id[*s.begin()]),a=s.begin();
				if(it!=s.begin())ans+=get(id[x],id[*(--it)]),b=it;
				else ans+=get(id[x],id[*(--s.end())]),b=--s.end();
				if(num>1)ans-=get(id[*a],id[*b]);
			}
			s.insert(x);vis[id[x]]=1;num++;
		}
		cout<<ans<<"\n";
	}
	return 0;
}

2023/11/13 20:48
加载中...