help,MLE all
查看原帖
help,MLE all
809708
whssy楼主2023/9/17 16:07
#include<cstdio>
#include<deque>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int N=3e5+5;
int n,a[N];
struct node{
	int fa,dep,top,size,son,_,ans;
	deque<int>sons;
};
node tree[N];
void dfs1(int u,int father){
	tree[u].fa=father;
	tree[u].dep=tree[father].dep+1;
	tree[u].size=1;
	for(int v:tree[u].sons){
		if(v==father) continue;
		dfs1(v,u);
		tree[u].size+=tree[v].size;
		if(tree[tree[u].son].size<tree[v].size)
			tree[u].son=v;
	}
}
void dfs2(int u,int t){
	tree[u].top=t;
	if(!tree[u].son) return;
	dfs2(tree[u].son,t);//搜重儿子 
	for(int v:tree[u].sons){
		if(v==tree[u].fa||v==tree[u].son)
			continue;
		dfs2(v,v);//搜轻儿子 
	}
}
int LCA(int u,int v){
	while(tree[u].top!=tree[v].top){
		if(tree[tree[u].top].dep<tree[tree[v].top].dep)
			swap(u,v);
		u=tree[tree[u].top].fa;
	}
	return tree[u].dep<tree[v].dep?u:v;
}
void dfs3(int u){
	tree[u].ans=tree[u]._;
	for(int v:tree[u].sons){
		if(v==tree[u].fa) continue;
		dfs3(v);
		tree[u].ans+=tree[v].ans;
	}
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(int i=1;i<=n-1;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		tree[u].sons.push_back(v);
		tree[v].sons.push_back(u);
	}
	dfs1(1,0);
	dfs2(1,1);
	for(int i=2;i<=n;i++){
		int lca=LCA(a[i-1],a[i]);
		tree[a[i-1]]._++;tree[a[i]]._++;
		tree[lca]._--;tree[tree[lca].fa]._--;
	}
	dfs3(1);
	for(int i=2;i<=n;i++)
		tree[a[i]].ans--;
	for_each(tree+1,tree+n+1,[=](const node &x){
		printf("%d\n",x.ans);
	});
	return 0;
}
2023/9/17 16:07
加载中...