求助月赛F题
查看原帖
求助月赛F题
343531
xiaosi4081楼主2024/3/10 10:47

rt,WA在第一个点,反过来处理合并的作法。

#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
using namespace std;
int t,n,q,e[300005],flg[300005],f[300005][19],dep[300005],length[300005];
struct edge1{
	int v,w,id;
};
vector<edge1>g[300005];
struct edge{
	int x,y;
}edges[300005];
void dfs(int u,int fa){
	dep[u]=dep[fa]+1;f[u][0]=fa;
	for(int i=1;i<=18;i++)f[u][i]=f[f[u][i-1]][i-1];
	for(auto v:g[u]){
		if(v.v==fa)continue;
		length[v.v]=length[u]+v.w;
		dfs(v.v,u);
	}
}
int lca(int x,int y){
	if(dep[x]>dep[y])swap(x,y);
	while(dep[y]-dep[x]){
		y=f[y][(int)log2(dep[y]-dep[x])];
	}
	if(x==y)return x;
	for(int i=18;i>=1;i--){
		if(f[x][i]!=f[y][i]){
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}
struct DSU{
	int f[300005];
	void init(int n){for(int i=1;i<=n;i++)f[i]=i;}
	int finds(int x){return f[x]==x?x:f[x]=finds(f[x]);}
}dsu;
int vis[300005];
void dfs2(int u,int fa,int flag){
	vis[u]=flag;
	for(auto v:g[u]){
		if(v.v==fa)continue;
		if(flg[v.id])continue;
		dfs2(v.v,u,flag);
	}
}
int farest=0,far=0;
void dfs3(int u,int fa,int dep){
	if(dep>=far)far=dep,farest=u;
	for(auto v:g[u]){
		if(v.v==fa)continue;
		if(flg[v.id])continue;
		dfs3(v.v,u,dep+v.w);
	}
}
int dis(int x,int y){
	return length[x]+length[y]-2ll*length[lca(x,y)];
}
int zj1[300005],zj2[300005],ans[300005];
signed main(){
	cin>>t;
	while(t--){
		cin>>n>>q;
		for(int i=1;i<=n;i++){
			vis[i]=0;dep[i]=length[i]=0;
			zj1[i]=zj2[i]=ans[i]=0;
			flg[i]=0,g[i].clear();
			edges[i]={0,0};
			memset(f[i],0,sizeof f[i]);
		}
		for(int i=1;i<n;i++){
			int u,v,w;
			cin>>u>>v>>w;
			edges[i]={u,v};
			g[u].push_back({v,w,i});
			g[v].push_back({u,w,i});
		}
		for(int i=1;i<=q;i++){
			cin>>e[i];
			flg[e[i]]=1;
		}
		dfs(1,0);
		int lcnt=0;int maxdis=0;
		for(int i=1;i<=n;i++){
			if(!vis[i]){
				dfs2(i,-1,++lcnt);
				
				farest=far=0;
				dfs3(i,-1,0);
				int d1=farest;
				
				farest=far=0;
				dfs3(d1,-1,0);
				int d2=farest;
				
				zj1[vis[i]]=d1;
				zj2[vis[i]]=d2;
				maxdis=max(maxdis,far);
			}
		}dsu.init(lcnt);
		for(int i=q;i>=1;i--){
			ans[i]=maxdis;
			int idx=vis[edges[e[i]].x],idy=vis[edges[e[i]].y];
			int fx=dsu.finds(idx),fy=dsu.finds(idy);
			int d[4]={zj1[fx],zj2[fx],zj1[fy],zj2[fy]};
			pii dres={0,0};int maxdisbet=0;
			for(int i1=0;i1<=3;i1++){
				for(int j=i1+1,x;j<=3;j++){
					x=dis(d[i1],d[j]);
					if(x>maxdisbet){
						maxdisbet=x;
						dres={d[i1],d[j]};
					}
				}
			}
			dsu.f[fx]=fy;
		//	cout<<d[0]<<"->"<<d[1]<<" and "<<d[2]<<"->"<<d[3]<<" = "<<dres.first<<"->"<<dres.second<<" "<<edges[e[i]].x<<" "<<edges[e[i]].y<<endl;
			zj1[fy]=dres.first,zj2[fy]=dres.second;
			maxdis=max(maxdis,maxdisbet);
		}
		for(int i=1;i<=q;i++)cout<<ans[i]<<endl;
	}
	return 0;
}
2024/3/10 10:47
加载中...