树上差分求助!!!
查看原帖
树上差分求助!!!
754467
f_hxr_楼主2023/5/10 19:15

rt

#include<bits/stdc++.h>
using namespace std;
int n,a[300005],F[300005][30],d[300005];
int head[300005],nxt[600005],to[600005],cnt,ans[300005];
void edge(int u,int v){
	nxt[++cnt]=head[u];to[cnt]=v;head[u]=cnt;
	nxt[++cnt]=head[v];to[cnt]=u;head[v]=cnt;	
}
void dfs1(int u,int fa){
	F[u][0]=fa;d[u]=d[fa]+1;
	for(int i=1;i<=30;i++)F[u][i]=F[F[u][i-1]][i-1];
	for(int i=head[u];i;i=nxt[i])
		if(to[i]!=fa)dfs1(to[i],u);
	return;
}
int dfs2(int u,int fa){
	for(int i=head[u];i;i=nxt[i])
		if(to[i]!=fa)ans[u]+=dfs2(to[i],u);
	return ans[u];
}
int LCA(int u,int v){
	if(d[u]<d[v])swap(u,v);
	for(int i=30;i>=0;i--)
		if(d[F[u][i]]>=d[v])u=F[u][i];
	if(u==v)return u;
	for(int i=30;i>=0;i--)
		if(F[u][i]!=F[v][i])u=F[u][i],v=F[v][i];
	return F[u][0];
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i]; 
	for(int i=1;i<n;i++){
		int a,b;
		cin>>a>>b;edge(a,b);
	}
	dfs1(1,0);
	for(int i=1;i<n;i++){
		int t=LCA(a[i],a[i+1]);
		ans[a[i]]++;ans[a[i+1]]++;
		ans[t]--;ans[F[t][0]]--;
	}
	dfs2(1,0);
	for(int i=2;i<=n;i++)ans[i]--;
	for(int i=1;i<=n;i++)cout<<ans[i]<<endl;
	return 0;
}
2023/5/10 19:15
加载中...