求助!用的树上差分,样例没过求调!
查看原帖
求助!用的树上差分,样例没过求调!
625821
2011qiqi楼主2022/9/14 09:11
#include<bits/stdc++.h>

using namespace std;

inline int read(){
	register int x=0,f=1;register char ch=getchar();
	while(!isdigit(ch)){if(ch=='-') f=~f+1;ch=getchar();}
	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x*f;
}

inline void print(int x){
	if(x<0) putchar('-'),x=-x;
	if(x>9) print(x/10);
	putchar(x%10+'0');
	return ;
}

const int N=3e5+5;

struct node{
	int to,nxt;
}s[N<<1];
int head[N],cnt,depth[N],fa[N][22],b[N],a[N];

inline void add(int a,int b){
	s[++cnt].to=b;
	s[cnt].nxt=head[a];
	head[a]=cnt;
	return ;
}

inline void dfs(int u,int father){
	depth[u]=depth[father]+1;
	fa[u][0]=father;
    register int i;
	for(i=1;(1<<i)<=depth[u];++i) fa[u][i]=fa[fa[u][i-1]][i-1];
	for(i=head[u];i;i=s[i].nxt){
		if(s[i].to==father) continue;
		dfs(s[i].to, u);
	}
	return ;
}

inline int LCA(int u,int father){
	if(depth[u]<depth[father]) swap(u, father);
	register int i;
	for(i=22;i>=0;--i) if((1<<i)<=depth[u]-depth[father]) u=fa[u][i];
	if(u==father) return u;
	for(i=22;i>=0;--i) if(fa[u][i]!=fa[father][i]) u=fa[u][i],father=fa[father][i];
	return fa[u][0];
}

inline void get_ans(int u,int father){
	register int i;
	for(i=head[u];i;i=s[i].nxt){
		if(s[i].to==father) continue;
		get_ans(s[i].to, u);
		b[u]+=b[s[i].to];
	}
}

int main(){
	register int n=read(),i,u,v,lca;
	for(i=1;i<=n;++i) a[i]=read();
	for(i=1;i<n;++i){
		u=read(),v=read();
		add(u, v);
		add(v, u);
	}
	dfs(1, 0);
	for(i=1;i<n;++i){
		u=a[i],v=a[i+1];
		lca=LCA(u, v);
		++b[u],++b[v],--b[lca],--b[fa[lca][0]];
	}
	get_ans(1, 0);
	for(i=2;i<=n;++i) b[a[i]]--;
	for(i=1;i<=n;++i) print(b[i]),putchar('\n');
	return 0;
}
2022/9/14 09:11
加载中...