采用的是第一篇题解的思路。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>
#define int __int128
using namespace std;
const int N = 1e5 + 10,M = 25,mod = 998244353;
inline void read(int &n){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
n=x*f;
}
inline void print(int n){
if(n<0){
putchar('-');
n*=-1;
}
if(n>9) print(n/10);
putchar(n % 10 + '0');
}
struct node{
int tim,pos;
}t[N];
int a[N],b[N],c[N],n;
int f[N],son[N],vis[N];
vector <int> G[N];
int sum(int p,int q,int d){
int num = (q - p) / d + 1;
return (p + q) * num / 2;
}
int calc(int i,int x){
if(c[i] > 0) return sum(b[i] + c[i],b[i] + x * c[i],c[i]);
else if(c[i] == 0) return b[i] * x;
else{
int f = (1 - b[i]) / c[i];
if(f <= 0 || f > x) return sum(b[i] + c[i],b[i] + x * c[i],c[i]);
else return sum(b[i] + c[i],b[i] + f * c[i],c[i]) + x - f;
}
}
int query(int i,int l,int r){
return calc(i,r) - calc(i,l - 1);
}
void dfs(int u,int fa){
f[u] = fa;//son[fa] = u;
for(auto v : G[u]){
if(v == fa) continue;
dfs(v,u);
}
}
bool cmp(node n1,node n2){
return n1.tim < n2.tim;
}
bool check(int day){
memset(t,0,sizeof(t));
memset(vis,0,sizeof(vis));
for(int i = 1;i <= n;i ++){
if(calc(i,day) < a[i]) return false;
else{
int l = 1,r = day;
while(l < r){//cout << 1;
int mid = (l + r + 1) / 2;
//cerr << i << ' ' << mid << '\n';
if(query(i,mid,day) >= a[i]){
l = mid;
}else{
r = mid - 1;
}
}
t[i].pos = i,t[i].tim = l;
}
}//return 1;
sort(t + 1,t + n + 1,cmp);
vis[0] = 1;int sumtim = 0;//return 0;
for(int i = 1;i <= n;i ++){
int pos = t[i].pos,tim = t[i].tim;
if(!vis[pos]){
int k = pos;
while(!vis[k]){
sumtim ++;vis[k] = 1;
k = f[k];// son[f[k]] = k;
}
if(sumtim > tim) return false;
}
}
return true;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
//maketag(1,1,1,1);
//freopen("fountain4.in","r",stdin);
read(n);
for(int i = 1;i <= n;i ++){
read(a[i]);read(b[i]);read(c[i]);
}
//cout << query(2,5,4);return 0;
for(int i = 1;i < n;i ++){
int u,v;read(u);read(v);
G[u].push_back(v);G[v].push_back(u);
}
long long l = n,r = 1e9;
while(l < r){
int mid = (l + r) / 2;//cerr <<mid;
if(check(mid)){
r = mid;
}else{
l = mid + 1;
}
}
print(l);
return 0;
}