F求hack
  • 板块灌水区
  • 楼主vflower
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/9 18:01
  • 上次更新2024/3/9 20:03:32
查看原帖
F求hack
1000066
vflower楼主2024/3/9 18:01
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e5+5;
vector<pair<int,int> > g[N];
int T,n,q,dis[N],top[N],son[N],siz[N],dep[N],id[N],fa[N],cnt=0;
void dfs1(int u,int f){
	fa[u]=f,siz[u]=1,dep[u]=dep[f]+1;
	int maxn=-1;
	for(int i=0;i<(int)g[u].size();i++){
		int v=g[u][i].first,w=g[u][i].second;
		if(v==f) continue;
		dis[v]=dis[u]+w;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(siz[v]>maxn) maxn=siz[v],son[u]=v;
	}
}
void dfs2(int u,int ftop){
	top[u]=ftop,id[u]=++cnt;
	if(!son[u]) return;
	dfs2(son[u],ftop);
	for(int i=0;i<(int)g[u].size();i++){
		int v=g[u][i].first;
		if(v==fa[u]||v==son[u]) continue;
		dfs2(v,v);
	}
}
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]];
	}
	if(dep[x]<dep[y]) swap(x,y);
	return y;
}
int qry(int x,int y){
	return dis[x]+dis[y]-2*dis[lca(x,y)];
}
int X[N],Y[N],vis[N],t[N],L[N],R[N],bl[N],ans[N],topp=0;
int find(int x){
	return bl[x]==x?x:bl[x]=find(bl[x]);
}
signed main(){
	for(int i=1;i<=1e5;i++) ans[i]=-1e17;
	scanf("%lld",&T);
	while(T--){
		scanf("%lld%lld",&n,&q);
		for(int i=1,x,y,z;i<n;i++){
			scanf("%lld%lld%lld",&x,&y,&z);
			g[x].push_back(make_pair(y,z));
			g[y].push_back(make_pair(x,z));
			X[i]=x,Y[i]=y;
		}
		dfs1(1,0),dfs2(1,1);
		for(int i=1,x;i<=q;i++) scanf("%lld",&x),t[++topp]=x,vis[x]=1;
		for(int i=1;i<n;i++) if(!vis[i]) t[++topp]=i;
		for(int i=1;i<=n;i++) L[i]=R[i]=bl[i]=i;
		for(int i=topp;i>=1;i--){
			int bx=find(X[t[i]]),by=find(Y[t[i]]);
			bl[bx]=by;
			int res1=qry(L[bx],L[by]),res2=qry(R[bx],L[by]),res3=qry(L[bx],R[by]),res4=qry(R[bx],R[by]);
			int res5=qry(L[bx],R[bx]),res6=qry(L[by],R[by]);
			int mx=max({res1,res2,res3,res4,res5,res6});
			if(res1==mx) R[by]=L[bx];
			else if(res2==mx) R[by]=R[bx];
			else if(res3==mx) L[by]=L[bx];
			else if(res4==mx) L[by]=R[bx];
			else if(res5==mx) L[by]=L[bx],R[by]=R[bx];
			ans[i]=max(ans[i+1],mx);
		}
		for(int i=1;i<=q;i++) printf("%lld\n",ans[i+1]);
		for(int i=1;i<=n;i++) g[i].clear(),ans[i]=-1e17,bl[i]=L[i]=R[i]=vis[i]=X[i]=Y[i]=t[i]=dis[i]=dep[i]=top[i]=son[i]=id[i]=siz[i]=fa[i]=0;
		cnt=topp=0;
	}
	return 0;
}
2024/3/9 18:01
加载中...