树上差分求调(码风优良)
  • 板块灌水区
  • 楼主xxxalq
  • 当前回复0
  • 已保存回复1
  • 发布时间2024/6/1 20:15
  • 上次更新2024/6/1 22:06:05
查看原帖
树上差分求调(码风优良)
322437
xxxalq楼主2024/6/1 20:15
#include<bits/stdc++.h>
using namespace std;
int read(){
	int x=0;
	bool flag=false;
	char ch=getchar();
	while(ch>57||ch<48){
		if(ch=='-'){
			flag=true;
		}
		ch=getchar();	
	}
	while(ch>=48&&ch<=57){
		x=(x<<1)+(x<<3)+(ch-48);
		ch=getchar();
	}
	return flag?-x:x;
}
int n,m,cf[200003],dep[200003],fa[200003][22],root;
vector<int>a[200003];
void dfs1(int u){
	dep[u]=dep[fa[u][0]]+1;
	for(int i=0;fa[u][i];i++){
		fa[u][i+1]=fa[fa[u][i]][i];
	}
	for(int i=0;i<a[u].size();i++){
		if(a[u][i]!=fa[u][0]){
			dfs1(a[u][i]);
		}
	}
	return;
}
int lca(int u,int v){
	if(dep[u]<dep[v]){
		swap(u,v);
	}
	for(int i=20;i>=0;i--){
		if(dep[u]-(1<<i)>=dep[v]){
			u=fa[u][i];
		}
	}
	if(u==v){
		return u;
	}
	for(int i=20;i>=0;i--){
		if(fa[u][i]!=fa[v][i]){
			u=fa[u][i],v=fa[v][i];
		}
	}
	return fa[u][0];
} 
void dfs(int u){
	for(int i=0;i<a[u].size();i++){
		if(a[u][i]!=fa[u][0]){
			dfs(a[u][i]);
			cf[u]+=cf[a[u][i]];		
		}
	}
	return;
}
int main(){
	n=read(),m=read();
	int u,v;
	for(int i=1;i<n;i++){
		u=read(),v=read();
		a[u].push_back(v);
		fa[v][0]=u;
	}
	for(int i=1;i<=n;i++){
		if(fa[i][0]==0){
			root=i;
			break;
		}
	}	
	dfs1(root);
	while(m--){
		u=read(),v=read();
		int l=lca(u,v);
		cf[u]+=1,cf[v]+=1,cf[l]-=1,cf[fa[l][0]]-=1;
	}
	dfs(root);
	for(int i=1;i<=n;i++){
		cout<<cf[i]<<" ";
	}
	return 0;
}

2024/6/1 20:15
加载中...