哇#20 求条
查看原帖
哇#20 求条
1451441
Mii2308楼主2025/7/28 13:46
#include<iostream>
#include<map>
#include<cmath>
#define N 300005
using namespace std;
int n,m;
int End[N],Next[N],Head[N],idx;
int End1[N],Next1[N],Head1[N],idx1;
int End2[N],Next2[N],Head2[N],idx2;
int deep[N],father[N][20],w[N];
map<long long ,long long> b1,b2;
int snum[N],dist[N],s[N],t[N];
int ans[N];
inline void add(int a,int b){
	idx++;End[idx]=b;Next[idx]=Head[a];Head[a]=idx;
}
inline void add1(int a,int b){
	idx1++;End1[idx1]=b;Next1[idx1]=Head1[a];Head1[a]=idx1;
}
inline void add2(int a,int b){
	idx2++;End2[idx2]=b;Next2[idx2]=Head2[a];Head2[a]=idx2;
}
inline void dfs1(int p){
	for(int i=1;(1<<i)<=deep[p];i++){
		father[p][i]=father[father[p][i-1]][i-1];
	}
	for(int i=Head[p];i;i=Next[i]){
		int j=End[i];
		if(j==father[p][0])continue;
		father[j][0]=p;deep[j]=deep[p]+1;
		dfs1(j);
	}
}
inline void dfs2(int p){
	int t1=b1[w[p]+deep[p]],t2=b2[w[p]-deep[p]];
	for(int i=Head[p];i;i=Next[i]){
		int j=End[i];
		if(j==father[p][0])continue;
		dfs2(j);
	}
	b1[deep[p]]+=snum[p];
	for(int i=Head1[p];i;i=Next1[i]){
		int j=End1[i];
		b2[dist[j]-deep[t[j]]]++;
	}
	ans[p]+=b1[w[p]+deep[p]]-t1+b2[w[p]-deep[p]]-t2;
	for(int i=Head2[p];i;i=Next2[i]){
		int j=End2[i];
		b1[deep[s[j]]]--;
		b2[dist[j]-deep[t[j]]]--;
	}
}
inline int getl(int x,int y){
	if(x==y) return x;
	if(deep[x]<deep[y]){int t=x,tt=y;x=tt,y=t;}
	int t=log(deep[x]-deep[y])/log(2);
	for(int i=t;i>=0;i--){
		if(deep[father[x][i]]>=deep[y]){
			x=father[x][i];
		}if(x==y) return x;
	}
	t=log(deep[x])/log(2);
	for(int i=t;i>=0;i--){
		if(father[x][i]!=father[y][i]){
			x=father[x][i];y=father[y][i];
		}
	}	
	return father[x][0];
}
int main(){
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);std::cout.tie(0);;
	cin>>n>>m;
	for(int i=1;i<n;i++){
		int a,b;cin>>a>>b;
		add(a,b);add(b,a);
	}
	deep[1]=1;father[1][0]=1;
	dfs1(1);
	for(int i=1;i<=n;i++) cin>>w[i];
	for(int i=1;i<=m;i++){
		cin>>s[i]>>t[i];
		int lca=getl(s[i],t[i]);
		dist[i]=deep[s[i]]+deep[t[i]]-2*deep[lca];
		snum[s[i]]++;
		add1(t[i],i);add2(lca,i);
		if(deep[lca]+w[lca]==deep[s[i]]) ans[lca]--;
	}
	dfs2(1);
	for(int i=1;i<=n;i++){
		cout<<ans[i]<<" ";
	}
	return 0;
}
2025/7/28 13:46
加载中...