是正解,但是云斗上 T 了,看看会不会寄/kel
#include<bits/stdc++.h>
#define rep(k,l,r) for(int k=l;k<=r;++k)
#define per(k,r,l) for(int k=r;k>=l;--k)
#define ll long long
//#define int long long
#define PII pair<int,int>
#define INF 0x3f3f3f3f
#define INFLL 0x3f3f3f3f3f3f3f3f
#define cl(f,x) memset(f,x,sizeof(f))
#define chkmax(a,b) a=max(a,b)
#define chkmin(a,b) a=min(a,b)
using namespace std;
const int N=1e5+5;
int head[N],len;
struct node {
int to,nxt;
}; node edge[N<<1];
void add_edge(int u,int v) {
edge[++len]={v,head[u]}; head[u]=len;
}
int f[N];
void dfs(int u,int fa) {
f[u]=fa;
for(int i=head[u];i;i=edge[i].nxt) {
int v=edge[i].to;
if(v!=fa)
dfs(v,u);
}
}
__int128 calc(__int128 x) {
return x*(x+1)/2;
}
const __int128 awa=1;
__int128 calc(__int128 a,__int128 b,__int128 c) {
if(c<0) {
__int128 x=max(awa,min(a+1,(__int128)ceil(1.0*(1-b)/c)));
return (x-1)*b+calc(x-1)*c+(a-x+1);
} else if(c==0)
return a*b;
else {
__int128 x=max(awa,min(a+1,(__int128)ceil(1.0*(1-b)/c)));
return (x-1)+(a-x+1)*b+(calc(a)-calc(x-1))*c;
}
}
ll a[N],b[N],c[N];
int p[N],t[N],n;
bool used[N];
int update(int u) {
if(used[u])
return 0;
used[u]=true;
if(f[u])
return update(f[u])+1;
return 1;
}
bool check(int x) {
rep(i,1,n) {
used[i]=false;
__int128 val=calc(x,b[i],c[i]);
if(val<a[i])
return false;
int l=1,r=x,ans=-1;
while(l<=r) {
int mid=(l+r)>>1;
if(val-calc(mid-1,b[i],c[i])>=a[i])
ans=mid,l=mid+1;
else
r=mid-1;
}
t[i]=ans;
}
sort(p+1,p+n+1,[](const int &x,const int &y) {
return t[x]<t[y];
});
int res=0;
rep(i,1,n) {
res+=update(p[i]);
if(res>t[p[i]])
return false;
}
return true;
}
ll read() {
ll x=0; char ch=getchar();
while(!isdigit(ch))
ch=getchar();
while(isdigit(ch))
x=x*10+ch-48,ch=getchar();
return x;
}
int main() {
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
n=read();
rep(i,1,n)
a[i]=read(),b[i]=read(),c[i]=read(),p[i]=i;
rep(i,2,n) {
int u=read(),v=read();
add_edge(u,v);
add_edge(v,u);
}
dfs(1,0);
int l=n,r=1e9,ans=1e9;
while(l<=r) {
int mid=(l+r)>>1;
if(check(mid))
r=mid-1,ans=mid;
else
l=mid+1;
}
printf("%d\n",ans);
return 0;
}