65pts 求调
查看原帖
65pts 求调
700547
wjh2011楼主2023/11/10 07:34
#include <bits/stdc++.h>
using namespace std;
#define N 100005
#define int long long
int n, a[N], b[N], c[N], day[N], cnt[N];
vector<int> e[N];
void dfs(int x, int fa) {
	for (auto y : e[x]) {
		if (y == fa) continue;
		dfs(y, x);
		day[x] = min(day[x], day[y] - 1);
	}
}
bool solve(int mid, int k, int i) {
	if (c[i] >= 0) return k * b[i] + (__int128)(2 * mid - k + 1) * mid * c[i] / 2 >= a[i];
	int x = abs(b[i] / c[i]);
	if (mid - k + 1 > x) return k >= a[i];
	return mid - x + (x + k - mid) * b[i] + (__int128)(x + k - mid) * (x + mid - k + 1) * c[i] / 2 >= a[i];
}
bool check(int Mid) {
	for (int i = 1; i <= n; i++) {
		if (!solve(Mid, Mid, i)) return 0;
		int l = 0, r = Mid;
		while (l <= r) {
			int mid = l + r >> 1;
			if (solve(Mid, mid, i)) day[i] = mid, r = mid - 1;
			else l = mid + 1;
		}
		day[i] = Mid - day[i] + 1;
	}
	memset(cnt, 0, sizeof(cnt));
	for (int i = 1; i <= n; i++)
		if (day[i] <= n)
			cnt[day[i]]++;
	int sum = 0;
	for (int i = 1; i <= n; i++) {
		sum += cnt[i];
		if (sum > i) return 0;
	}
	return 1;
}
signed main() {
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i] >> b[i] >> c[i];
	for (int i = 1; i < n; i++) {
		int x, y;
		cin >> x >> y;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	int l = n, r = 1e9, ans = 0;
	while (l <= r) {
		int mid = l + r >> 1;
		if (check(mid)) ans = mid, r = mid - 1;
		else l = mid + 1;
	}
	cout << ans;
	return 0;
}

剩下的35pts都比答案少一。

2023/11/10 07:34
加载中...