25 分贪心把自测 T4 过了???????????
  • 板块学术版
  • 楼主Arghariza
  • 当前回复11
  • 已保存回复11
  • 发布时间2023/10/22 09:11
  • 上次更新2023/10/22 11:29:42
查看原帖
25 分贪心把自测 T4 过了???????????
306573
Arghariza楼主2023/10/22 09:11
#include <bits/stdc++.h>
#define pb emplace_back
#define mp make_pair
#define fi first
#define se second
// #define FILE

using namespace std;
#define int long long
typedef long long ll;
typedef pair<int, int> pi;
bool Mbe;

const int N = 1e5 + 100;
const int T = (1 << 20) + 10;

int n, a[N], b[N], c[N], t[N];
vector<int> g[N];

int calc(int x, int i) {
	if (!x) return 0;
	if (!c[i]) return max(1ll, b[i]) * x;
	else if (c[i] > 0) return x * b[i] + x * (x + 1) / 2 * c[i];
	else {
		int tp = 1. * (1 - b[i]) / c[i];
		if (x <= tp) return (2 * b[i] + (x + 1) * c[i]) * x / 2;
		else return (2 * b[i] + (tp + 1) * c[i]) * tp / 2 + x - tp;
	}
}

bool chk3(int x) {
	for (int i = 1; i <= n; i++) {
		int l = 1, r = x; t[i] = 0;
		while (l <= r) {
			int md = (l + r) >> 1;
			if (calc(x, i) - calc(md - 1, i) >= a[i]) t[i] = md, l = md + 1;
			else r = md - 1;
		}
		t[i] = min(t[i], n);
	}
	// for (int i = 1; i <= n; i++) cout << t[i] << ' ';
	if (t[1] < 1) return 0;
	sort(t + 2, t + n + 1);
	for (int i = 2; i <= n; i++)
		if (t[i] < i) return 0;
	return 1;
}

void solve() {
	cin >> n;
	for (int i = 1; i <= n; i++) 
		cin >> a[i] >> b[i] >> c[i];
	int fl = 1;
	for (int i = 1, u, v; i <= n - 1; i++) {
		cin >> u >> v, g[u].pb(v), g[v].pb(u);
		if (u != i || v != i + 1) fl = 0;
	}
	if (fl) {
		int ans = 0;
		for (int i = 1; i <= n; i++) {
			int l = i, r = 1e9, res = 1e9;
			while (l <= r) {
				int md = (l + r) >> 1;
				if (calc(md, i) - calc(i - 1, i) >= a[i]) res = md, r = md - 1;
				else l = md + 1;
			}
			ans = max(ans, res);
		}
		cout << ans << '\n';
		return;
	}
	// cout << chk3(9) << '\n';
	int l = 1, r = 1e9, res = 1e9;
	while (l <= r) {
		int md = (l + r) >> 1, flg;
		flg = chk3(md); 
		if (flg) res = md, r = md - 1;
		else l = md + 1;
	}
	cout << res << '\n';
}

bool Med;
signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cerr << (&Mbe - &Med) / 1024 / 1024 << " MB\n";
	#ifdef FILE
		freopen("tree.in", "r", stdin);
		freopen("tree.out", "w", stdout);
	#endif
	int T = 1;
	// cin >> T;
	while (T--) solve();
	cerr << 1. * clock() / CLOCKS_PER_SEC << " ms\n";
	return 0;
}

2023/10/22 09:11
加载中...