CSP-S T4 85分求条
  • 板块学术版
  • 楼主__ycx2010__
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/23 16:12
  • 上次更新2023/11/2 11:43:14
查看原帖
CSP-S T4 85分求条
819929
__ycx2010__楼主2023/10/23 16:12

rt

#include <bits/stdc++.h>
#define int long long
using namespace std;

typedef pair<long long, long long> PII;
const int N = 2e5 + 10;
int n, day;
int h[N], e[N * 2], ne[N * 2], idx;
int d[N], p[N], b[N], c[N], ee[N];
long long a[N];
bool vis[N];

void add(int a, int b) {
	e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}

void dfs(int x, int fa) {
	p[x] = fa;
	for (int i = h[x]; ~i; i = ne[i]) {
		int y = e[i];
		if (y == fa) continue;
		dfs(y, x);
	}
}

bool plant(int x) {
	if (vis[x]) return true;
	if (!plant(p[x])) return false;
	if (++ day > d[x]) return false;
	return vis[x] = true;
}

bool check(int k) {
	for (int i = 1; i <= n; i ++ ) {
		if (c[i] > 0) {
			int l = 1, r = k;
			while (l < r) {
				int mid = l + r + 1 >> 1;
				if ((__int128)(b[i] + c[i] * mid + b[i] + c[i] * k) * (k - mid + 1) / 2 >= a[i]) l = mid;
				else r = mid - 1;
			}
			d[i] = l;
		} else if (c[i] == 0) {
			d[i] = k - (a[i] + b[i] - 1) / b[i] + 1;
		} else {
			if (k - ee[i] + 1 >= a[i]) d[i] = k - a[i] + 1;
			else {
				a[i] -= k - ee[i] + 1;
				int l = 1, r = ee[i] - 1;
				while (l < r) {
					int mid = l + r + 1 >> 1;
					if ((__int128)(b[i] + c[i] * mid + b[i] + c[i] * (ee[i] - 1)) * (ee[i] - mid) / 2 >= a[i]) l = mid;
					else r = mid - 1;
				}
				a[i] += k - ee[i] + 1;
				d[i] = l;
 			}
		}
	}
	day = 0;
	memset(vis, 0, sizeof vis);
	vis[0] = true;
	priority_queue<PII, vector<PII>, greater<PII>> heap;
	for (int i = 1; i <= n; i ++ ) heap.push({d[i], i});
	for (int i = 1; i <= n; i ++ ) {
		if (!plant(heap.top().second)) return false;
		heap.pop();
	}
	return true;
}

signed main() {
	scanf("%lld", &n);
	for (int i = 1; i <= n; i ++ ) {
		scanf("%lld%lld%lld", &a[i], &b[i], &c[i]);
		if (c[i] >= 0) continue;
		int l = 0, r = 1e9;
		while (l < r) {
			int mid = l + r >> 1;
			if (b[i] + mid * c[i] <= 1) r = mid;
			else l = mid + 1;
		}
		ee[i] = l;
	}
	memset(h, -1, sizeof h);
	for (int i = 1; i < n; i ++ ) {
		int u, v;
		scanf("%lld%lld", &u, &v);
		add(u, v), add(v, u);
	}
	dfs(1, 0);
	int l = n, r = 1e9;
	while (l < r) {
		int mid = l + r >> 1;
		if (check(mid)) r = mid;
		else l = mid + 1;
	}
	printf("%lld", l);
	return 0;
}
2023/10/23 16:12
加载中...