求调
查看原帖
求调
361141
_JF_殉情楼主2023/5/16 22:10
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
vector<int> G[N<<1],g[N<<1];
int vis1[N],ans[N],F[N],fa[N][22],lst[N],dp[N],vis[N],dep[N],dfn[N],now,siz[N];
void dfs(int u,int fath){
	dep[u]=dep[fath]+1,dfn[u]=++now,siz[u]=1;
	fa[u][0]=fath;
	for(int i=1;i<=22;i++)	fa[u][i]=fa[fa[u][i-1]][i-1];
	for(int i=0;i<g[u].size();i++){
		int v=g[u][i];
		if(v==fath)	continue;
		dfs(v,u);	
		siz[u]+=siz[v];
	}
}
bool cmp(int x,int y){
	return dfn[x]<dfn[y];
}
int cal(int x,int y){
	int p=y,q=y;
	for(int i=log2(dep[p]);i>=0;i--)	if(dep[fa[p][i]]>dep[x])	p=fa[p][i];
	ans[F[x]]-=siz[p];
	for(int i=log2(dep[q]);i>=0;i--){
		int now=dep[y]-dep[fa[q][i]]+dp[y],now1=dep[fa[q][i]]-dep[x]+dp[x];
		if(dep[fa[q][i]]>dep[x]&&(now<now1||(now==now1&&F[y]<F[x]))) q=fa[q][i];
	}
	ans[F[y]]+=siz[q]-siz[y],ans[F[x]]+=siz[p]-siz[q];
}
void dfs1(int u,int fa){
	dp[u]=INT_MAX;
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i];
		if(v==fa)	continue;
		dfs1(v,u);
		int dis=dep[v]-dep[u];
		if(dp[v]+dis<dp[u])	dp[u]=dp[v]+dis,F[u]=F[v];
		else if(dp[u]+dis==dp[v])	F[u]=min(F[u],F[v]);
	}
	if(vis[u])	dp[u]=0,F[u]=u;
}
void dfs2(int u,int fa){
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i];
		if(v==fa)	continue;
		int dis=dep[v]-dep[u];
		if(dp[v]+dis<dp[u])	dp[u]=dp[v]+dis,F[u]=F[v];
		else if(dp[u]+dis==dp[v])	F[u]=min(F[u],F[v]);
		cal(u,v);
		dfs2(u,v);
	}
	ans[F[u]]+=siz[u];
	vis[u]=0;
}
void Add(int u,int v){
	G[u].push_back(v);
}
int LCA(int x,int y){
	if(dep[x]<dep[y])	swap(x,y);
	int d=dep[x]-dep[y];
	for(int i=22;i>=0;i--)	if((1<<i)&d)	x=fa[x][i];
	if(x==y)	return x;
	for(int i=22;i>=0;i--)	if(fa[x][i]!=fa[y][i])	x=fa[x][i],y=fa[y][i];
	return fa[x][0];
}
int main()
{
	int n;
	cin>>n;
	for(int i=1,u,v;i<n;i++)	cin>>u>>v,g[u].push_back(v),g[v].push_back(u);
	dfs(1,0);
	int t;
	cin>>t;
	while(t--){
		int m;
		cin>>m;
		bool f=true;
		for(int i=1;i<=m;i++)	cin>>lst[i],vis[lst[i]]=1;
		if(!vis[1])	lst[++m]=1,f=0;
		sort(lst+1,lst+m+1,cmp);
		stack<int> s;
		s.push(1);
		for(int i=1;i<=m;i++){
			int u=lst[i],lca=LCA(u,s.top());
			while(lca!=s.top()){
				int now=s.top();s.pop();
				if(dfn[s.top()]<dfn[lca])	s.push(lca);
				Add(now,s.top());
			}
		}
		while(s.top()!=1){
			int now=s.top();s.pop();
			Add(now,s.top());
		}
		for(int i=1;i<=m;i++)	vis1[i]=lst[i];
		dfs1(1,0),dfs2(1,0);
		for(int i=1;i<=m;i++)	if(vis1[i]!=1||f)	cout<<ans[lst[i]]<<" ";
		cout<<endl;
	}
	return 0;
}

已经爆炸了。

求调/kel

2023/5/16 22:10
加载中...