求调
查看原帖
求调
700558
williamwei楼主2024/10/16 13:21
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 1e5 + 10;
const int inf = 1e9;
int n, a[maxn], b[maxn], c[maxn], p[maxn], w[maxn], fa[maxn], stk[maxn];
bool vis[maxn];
vector<int> e[maxn];
void dfs(int u, int pa) { fa[u] = pa; for (int v : e[u]) if (v != pa) dfs(v, u); }
int calc(int x, int l, int r) {
	if (c[x] >= 0) return (r - l + 1) * b[x] + ((r - l + 1) * (l + r) * c[x] >> 1);
	int k = (1 - b[x]) / c[x];
	if (k < l) return r - l + 1;
	if (k > r) return (r - l + 1) * b[x] + ((r - l + 1) * (l + r) * c[x] >> 1);
	return (k - l + 1) * b[x] + ((k - l + 1) * (l + k) * c[x] >> 1) + r - k;
}
bool check(int x) {
	for (int i = 1; i <= n; i++) {
		int l = 1, r = x; w[i] = 0; vis[i] = false;
		while (l <= r) {
			int mid = (l + r) >> 1;
			if (calc(i, mid, x) >= a[i]) l = mid + 1, w[i] = mid;
			else r = mid - 1;
		} if (!w[i]) return false;
	}
	sort(p + 1, p + n + 1, [](int x, int y) {return w[x] < w[y]; });
	for (int i = 1, T = 0; i <= n; i++) {
		int cur = p[i], top = 0;
		while (!vis[cur]) stk[++top] = cur, vis[cur] = true, cur = fa[cur];
		while (top) if (w[stk[top--]] < ++T) return false;
	} return true;
}
int main() {
	ios::sync_with_stdio(false);
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i] >> b[i] >> c[i], p[i] = i;
	for (int i = 1; i < n; i++) {
		int u, v; cin >> u >> v;
		e[u].push_back(v); e[v].push_back(u);
	} dfs(1, 0); int l = n, r = inf, res = inf;
	while (l <= r) {
		int mid = (l + r) >> 1;
		if (check(mid)) r = mid - 1, res = mid;
		else l = mid + 1;
	} cout << res << '\n';
	return 0;
}
2024/10/16 13:21
加载中...