只过样例求调
查看原帖
只过样例求调
841638
Igunareo楼主2024/7/4 07:18
#include<bits/stdc++.h>
#define int long long
using namespace std;
int fa[100005][20],dis[100005],dep[100005],check[100005],maxx;
int num[100005],got[100005],l[100005],r[100005],ans[100005];
struct edge{int a,b,p;}y[100005];
vector<pair<int,int> >z[100005];
int findd(int now){
	if(got[now]==now)return now;
	return got[now]=findd(got[now]);
}
void dfs(int now,int father){
	fa[now][0]=father;
	for(int i=0;i<z[now].size();i++){
		if(z[now][i].first!=father){
			dep[z[now][i].first]=dep[now]+1;
			dis[z[now][i].first]=dis[now]+z[now][i].second;
			dfs(z[now][i].first,now);
		}
	}
	return;
}
pair<int,int>dfs2(int now,int father,int summ){
	pair<int,int>b;
	b.first=summ;
	b.second=now;
	for(int i=0;i<z[now].size();i++){
		if(z[now][i].first!=father){
			pair<int,int>a=dfs2(z[now][i].first,now,summ+z[now][i].second);
			if(a.first>b.first)b=a;
		}
	}
	return b;
}
int jump(int a,int b){
	int ned=dep[a]-dep[b];
	for(int i=17;i>=0;i--)if(ned&(1<<i))a=fa[a][i];
	return a;
}
int LCA(int a,int b){
	if(a==b)return a;
	for(int i=17;i>=0;i--){
		if(fa[a][i]!=fa[b][i]){
			a=fa[a][i];
			b=fa[b][i];
		}
	}
	return fa[a][0];
}
int far(int a,int b){
	if(dep[a]<dep[b])swap(a,b);
	int d=jump(a,b);
	int c=LCA(d,b);
	return dis[a]+dis[b]-dis[c]*2ll;
}
signed main(){
	int T;
	scanf("%lld",&T);
	while(T--){
		maxx=0;
		int n,q;
		scanf("%lld%lld",&n,&q);
		for(int i=1;i<=n;i++){
			z[i].clear();
			dis[i]=dep[i]=check[i]=l[i]=r[i]=0;
			got[i]=i;
			for(int j=0;j<=17;j++)fa[i][j]=0;
		}
		for(int i=1;i<n;i++){
			scanf("%lld%lld%lld",&y[i].a,&y[i].b,&y[i].p);
			z[y[i].a].push_back(make_pair(y[i].b,y[i].p));
			z[y[i].b].push_back(make_pair(y[i].a,y[i].p));
		}
		dfs(1,0);
		for(int i=1;i<=17;i++)for(int j=1;j<=n;j++)fa[j][i]=fa[fa[j][i-1]][i-1];
		for(int i=1;i<=n;i++)z[i].clear();
		for(int i=1;i<=q;i++){
			scanf("%lld",&num[i]);
			check[num[i]]=1;
		}
		for(int i=1;i<n;i++){
			if(!check[i]){
				int atop=findd(y[i].a),btop=findd(y[i].b);
				got[atop]=btop;
				z[y[i].a].push_back(make_pair(y[i].b,y[i].p));
				z[y[i].b].push_back(make_pair(y[i].a,y[i].p));
			}
		}
		for(int i=1;i<=n;i++){
			int atop=findd(i);
			if(!l[atop]){
				l[atop]=dfs2(i,0,0).second;
				pair<int,int>a=dfs2(l[atop],0,0);
				maxx=max(maxx,a.first);
				r[atop]=a.second;
			}
		}
		for(int i=q;i>=1;i--){
			ans[i]=maxx;
			int atop=findd(y[num[i]].a),btop=findd(y[num[i]].b);
			got[btop]=atop;
			int a=far(l[atop],r[atop]),b=far(l[btop],r[btop]);
			int c=far(l[atop],y[num[i]].a)+far(l[btop],y[num[i]].b)+y[num[i]].p;
			int d=far(l[atop],y[num[i]].a)+far(r[btop],y[num[i]].b)+y[num[i]].p;
			int e=far(r[atop],y[num[i]].a)+far(l[btop],y[num[i]].b)+y[num[i]].p;
			int f=far(r[atop],y[num[i]].a)+far(r[btop],y[num[i]].b)+y[num[i]].p;
			maxx=max(maxx,max(max(a,b),max(max(c,d),max(e,f))));
			if(b>=a&&b>=c&&b>=d&&b>=e&&b>=f){
				l[atop]=l[btop];
				r[atop]=r[btop];
			}
			else if(c>=a&&c>=b&&c>=d&&c>=e&&c>=f)r[atop]=l[atop];
			else if(d>=a&&d>=b&&d>=c&&d>=e&&d>=f)r[atop]=r[btop];
			else if(e>=a&&e>=b&&e>=c&&e>=d&&e>=f)l[atop]=l[btop];
			else if(f>=a&&f>=b&&f>=c&&f>=d&&f>=e)l[atop]=r[btop];
		}
		for(int i=1;i<=q;i++)printf("%lld\n",ans[i]);
	}
	return 0;
} 
2024/7/4 07:18
加载中...