#13 求卡常
查看原帖
#13 求卡常
519384
Link_Cut_Y楼主2024/8/5 15:29
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#define gc getchar
#define pc putchar
#define rep(i, a, b) for (int i = (a); i <= (b); i ++ )
#define rop(i, a, b) for (int i = (a); i < (b); i ++ )
#define dep(i, a, b) for (int i = (a); i >= (b); i -- )

using namespace std;

const int N = 300010;
const int mod = 998244353; int T = 1;
void read() { return; } template <typename T, typename ...T2> void read(T &s, T2 &...oth) { s = 0; char ch = gc(); bool f = 0; for (; ch < '0' or ch > '9'; ch = gc()) if (ch == '-') f = 1; for (; ch >= '0' and ch <= '9'; ch = gc()) s = (s << 1) + (s << 3) + (ch ^ 48); s = f ? -s : s; read(oth...); return; }
void write(char ch) { return; } template <typename T, typename ...T2> void write(char ch, T s, T2 ...oth) { if (!s) { pc('0'); pc(ch); write(ch, oth...); return; } int stk[100], top = 0; if (s < 0) pc('-'), s = ~s + 1; while (s) stk[ ++ top] = s % 10, s /= 10; do pc(stk[top -- ] + (1 << 4) + (1 << 5)); while (top); pc(ch); write(ch, oth...); return; }
int qpow(int a, int b = mod - 2, int s = 1) { for (; b; b >>= 1, a = a * a % mod) if (b & 1) s = s * a % mod; return s; }

int fa[N][16], dep[N];
int n, m, cnt, s[N], val[N], d[N];
struct Paths { int u, v, w; }p[N];
vector<pair<int, int>> E[N];
inline void dfs(int u, int F) {
	fa[u][0] = F; d[u] = d[F] + 1;
	for (auto [v, w] : E[u]) if (v ^ F) 
		dep[v] = dep[u] + w, val[v] = w, dfs(v, u);
}
inline int lca(int u, int v) {
	if (d[u] < d[v]) swap(u, v);
	dep(i, 15, 0) if (d[fa[u][i]] >= d[v]) u = fa[u][i];
	dep(i, 15, 0) if (fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i];
	return u == v ? u : fa[u][0];
}
inline void dfs(int u) {
	for (auto [v, w] : E[u]) if (v ^ fa[u][0]) {
		dfs(v); s[u] += s[v];
	}
}
inline bool check(int mid) {
	rep(i, 1, n) s[i] = 0; int c = 0, mx = 0;
	rep(i, 1, m) {
		if (p[i].w > mid) {
			int u = p[i].u, v = p[i].v;
			int F = lca(u, v); c ++ ;
			s[u] ++ , s[v] ++ ; s[F] -= 2;
			mx = max(mx, p[i].w);
		}
	} dfs(1);
	rep(i, 1, n) if (s[i] == c)
		if (mx - val[i] <= mid) return 1;
	return 0;
}
int main() {
	read(n, m);
	rop(i, 1, n) {
		int a, b, c; read(a, b, c);
		E[a].push_back({b, c});
		E[b].push_back({a, c});
	} dfs(1, 0);
	rep(j, 1, 15) rep(i, 1, n)
		fa[i][j] = fa[fa[i][j - 1]][j - 1];
	rep(i, 1, m) {
		int u, v; read(u, v); int F = lca(u, v);
		p[i] = {u, v, dep[u] + dep[v] - dep[F] * 2};
	}
	int l = 0, r = 0;
	rep(i, 1, m) r = max(r, p[i].w);
	while (l < r) {
		int mid = (l + r) >> 1;
		if (check(mid)) r = mid;
		else l = mid + 1;
	} printf("%d\n", l);
	return 0;
}
2024/8/5 15:29
加载中...