蒟蒻树剖27分求助
查看原帖
蒟蒻树剖27分求助
947506
Eternal_Regret楼主2024/2/29 23:57
#include<bits/stdc++.h>
#define ls p<<1
#define rs p<<1|1
#define mid ((l+r)>>1)
using namespace std;
using ll = long long;
const int N = 50010;
int n, k, cnt;
int sz[N], son[N], f[N], id[N], top[N], d[N];
vector<int> g[N];
struct node {
	int l, r;
	ll t, maxn;
}tr[N << 2];
void pushdown(int p) {
	if (tr[p].t) {
		tr[ls].maxn += tr[p].t, tr[rs].maxn += tr[p].t;
		tr[ls].t += tr[p].t, tr[rs].t = tr[p].t;
		tr[p].t = 0;
	}
}
void pushup(int p) {
	tr[p].maxn = max(tr[ls].maxn, tr[rs].maxn);
}
void build(int p, int l, int r) {
	tr[p] = { l,r,0,0 };
	if (l == r)return;
	build(ls, l, mid);
	build(rs, mid + 1, r);
	pushup(p);
}
void update(int p, int l, int r, int k) {
	if (tr[p].l >= l && tr[p].r <= r) {
		tr[p].maxn += k;
		tr[p].t += k;
		return;
	}
	pushdown(p);
	int m = tr[p].l + tr[p].r >> 1;
	if (l <= m)update(ls, l, r, k);
	if (r > m)update(rs, l, r, k);
	pushup(p);
}
void dfs(int u, int fa) {
	sz[u] = 1, f[u] = fa;
	if (u == 1)d[u] = 1;
	else d[u] = d[fa] + 1;
	for (auto& s : g[u]) {
		if (s == fa)continue;
		dfs(s, u);
		sz[u] += sz[s];
		if (sz[son[u]] < sz[s])son[u] = s;
	}
}
void dfs2(int u, int t) {
	top[u] = t, id[u] = ++cnt;
	if (!son[u])return;
	dfs2(son[u], t);
	for (auto& s : g[u]) {
		if (s == f[u] || s == son[u])continue;
		dfs2(s, s);
	}
}
void update_path(int u, int v) {
	while (top[u] != top[v]) {
		if (d[top[u]] < d[top[v]])swap(u, v);
		update(1, id[top[u]], id[u], 1);
		u = f[top[u]];
	}
	if (d[u] < d[v])swap(u, v);
	update(1, id[v], id[u], 1);
}
int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin >> n >> k;
	for (int i = 1; i < n; i++) {
		int u, v; cin >> u >> v;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	dfs(1, -1);
	dfs2(1, 1);
	build(1, 1, n);
	while (k--) {
		int u, v; cin >> u >> v;
		update_path(u, v);
	}
	cout << tr[1].maxn;
	return 0;
}
2024/2/29 23:57
加载中...