萌新袜子刚学 CSP 全 RE 求助
查看原帖
萌新袜子刚学 CSP 全 RE 求助
759710
LuoFeng_Nanami楼主2023/9/28 09:21

lca + 树上差分

#include<bits/stdc++.h>
#define ll long long
#define rll register ll
#define F(i,a,b) for(rll i=a;i<=b;i++)
#define Fdn(i,a,b) for(rll i=a;i>=b;i--)
#define int ll
#define itn int
#define umap unordered_map
#define uset unordered_set
#define ld long double
#define pii pair<int,int>
#define pll pair<long long,long long>
#define pb push_back

using namespace std;

const int inf = 0x3f3f3f3f,mod = 1e9 + 7; 
const int maxn = 5e4 + 7,Logn = 27;

int n,q;
vector<int> G[maxn];
int sum[maxn];
int ans;
int f[maxn][Logn];
int dep[maxn];

inline void dfs(int u, int fa){
	dep[u] = dep[fa] + 1;
	f[u][0] = fa;
	for(int i = 0; f[u][i]; i++) f[u][i + 1] = f[f[u][i]][i];
	for(auto v : G[u])
		if(v != fa)
			dfs(v, u);
}

inline int lca_get(int u,int v){
	if(dep[u] > dep[v])
		swap(u, v);
	Fdn(i, 21, 0)
		if(dep[u] <= dep[v] - (1 << i)) 
			v = f[v][i];
	if(u == v)
		return u;
	Fdn(i, 21, 0)
		if(f[u][i] != f[v][i])
			u = f[u][i],v = f[v][i];
	return f[u][0];
}

inline int getans(int u,int fa){
	for(auto v : G[u]){
		if(v == fa)
			continue;
		getans(v, u);
		sum[u] += sum[v];
	}
	ans = max(ans, sum[u]);
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	
	cin >> n >> q;
	F(i, 1, n - 1){
		int u, v;
		cin >> u >> v;
		G[u].pb(v), G[v].pb(u);
	}
	dfs(1, 0);
	F(i,1,q){
		int u, v;
		cin >> u >> v;
		int l = lca_get(u, v);
		sum[u]++, sum[v]++, sum[l]--, sum[f[l][0]]--;
	}
	getans(1, 0);
	cout << ans;
	
	return 0;
}
2023/9/28 09:21
加载中...