样例过了求调
查看原帖
样例过了求调
483058
陈泽涵爱g编程楼主2023/11/8 23:14
#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
//#define int long long
#define _int __int128
using namespace std;
const int maxn = 1e5 + 1;
int n, a[maxn], b[maxn], c[maxn];
int f[maxn];
vector<int>g[maxn];
void dfs(int x, int fa) {
	f[x] = fa;
	for(int i = 0; i < g[x].size(); i++) {
		int v = g[x][i];
		if(v == fa) continue;
		dfs(v, x);
	}
	return ;
}
bool cal(int l, int r, int i) {
	if(c[i] >= 0) return b[i] * (r - l + 1) + (r - l + 1) * (l + r) / 2 * c[i] > a[i];
	int I = (1 - b[i]) / c[i];
	if(r < I) return b[i] * (r - l + 1) + (r - l + 1) * (l + r) / 2 * c[i] > a[i];
	if(l > I) return (r - l + 1) > a[i];
	else  return b[i] * (I - l + 1) + c[i] * (l + I) * (I - l + 1) / 2 + r - I > a[i];
}
struct node {
	int id, num;
	bool operator < (const node &t) const {
		return num < t.num;
	}
} T[maxn];
int  tag[maxn], cnt;
void find(int x) {
//	cout << x;
	if(f[x] == 0 || tag[f[x]]) {
		tag[x] = ++cnt;
		return;
	}
	find(f[x]);
	tag[x] = ++cnt;
	return ;
}
bool check(int r) {
	cnt = 0;
	for(int i = 1; i <= n; i++) {
		int dl = 1, dr = n + 1;
		while(dl < dr) {
			int mid = (dl + dr) / 2;
			if(cal(mid, r, i)) dl = mid + 1;
			else dr = mid;
//			cout << mid;
		}
//		cout << dl << ' ';
		T[i] = {i, dl};
		tag[i] = 0;
	}
//	cout << '\n';
	sort(T + 1, T + 1 + n);
//	cout << 1;
	for(int i = 1; i <= n; i++) {
		if(tag[T[i].id]) continue;
		else {
			find(T[i].id);
			if(tag[i] > T[i].num) return false;
		}
	}
	return true;
}
int read() {
	char x = getchar();
	int res = 0, flag = 1;
	while('0' > x || '9' < x) {
		if(x == '-') flag = -1;
		x = getchar();
	}
	while('0' <= x && x <= '9') {
		res = res * 10 + x - '0';
		x = getchar();
	}
	return res * flag;
}
void Write(int x) {
	if(x > 9) {
		Write(x / 10);
	}
	putchar(x % 10 + '0');
	return ;
}
signed main() {
//	ios::sync_with_stdio(false);
//	cin.tie(0);
//	cout.tie(0);
	n = read();
	for(int i = 1; i <= n; i++) {
		a[i] = read();
		b[i] = read();
		c[i] = read();
	}
	for(int i = 1; i < n; i++) {
		int u, v;
		u = read();
		v = read();
		g[u].push_back(v);
		g[v].push_back(u);
	}
	dfs(1, 0);
	int l = n + 1, r = 1e9;
	while(l < r) {
//		cout << 1;
		int mid = (l + r >> 1);
		if(check(mid)) {
			r = mid;
		} else {
			l = mid + 1;
		}
	}
	Write(l);
	return 0;
}
2023/11/8 23:14
加载中...