树上差分全WA,求调
查看原帖
树上差分全WA,求调
655579
Peizekai楼主2024/4/2 18:00
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
int n,a[N],d[N],f[N][31],ans[N];
vector<int>g[N];
void dep(int p,int depth){
	d[p]=depth;
	for(int i=1;i<=30;i++) f[p][i]=f[f[p][i-1]][i-1];
	for(int i=0;i<g[p].size();i++){
		int v=g[p][i];
		if(v==f[p][0]) continue;
		f[v][0]=p;
		dep(v,depth+1);
	}
}
void cal(int p){
	for(int i=0;i<g[p].size();i++){
		int v=g[p][i];
		if(v==f[p][0]) continue;
		cal(v);
		ans[p]+=ans[v];
	}
}
int lca(int x,int y){
	if(d[x]<d[y]) swap(x,y);
	for(int i=30;i>=0;i--)
		if(dep[f[x][i]]>=dep[y])
			x=f[x][i];
	if(x==y) return x;
	for(int i=30;i>=0;i--)
		if(f[x][i]!=f[y][i])
			x=f[x][i],y=f[y][i];
	return f[x][0];
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1,u,v;i<n;i++) cin>>u>>v,g[u].push_back(v),g[v].push_back(u);
	dep(1,1);
	for(int i=1;i<n;i++){
		int k=lca(a[i],a[i+1]);
		ans[a[i]]++,ans[a[i+1]]++;
		ans[k]--,ans[f[k][0]]--;
	}
	ans[a[1]]++;
	cal(1);
	for(int i=1;i<=n;i++)
		cout<<ans[i]-1<<'\n';
	return 0;
}
2024/4/2 18:00
加载中...