这个蒟蒻由于没在考场上遇到过大模拟而被T3爆杀导致T4没时间调。
警钟长鸣。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,fa[N],f[N],day;
int a[N],b[N],c[N],d[N];
int head[N],ei,ans;
struct edge{
int v,nxt;
}egs[N<<1];
struct node{
int w,u;
bool operator<(const node &t)
const {return w>t.w;}
};
inline void add(int u,int v){
egs[++ei]=(edge){v,head[u]};head[u]=ei;
}
inline int ff(int x){return x*(x+1)/2;}
inline int qry(int i,int y,int res){
int x=(1-b[i])/c[i];
if(c[i]>0)
if(x>=y)return (x-y+1)+(res-x)*b[i]+(ff(res)-ff(x))*c[i];
else return (res-y+1)*b[i]+(ff(res)-ff(y-1))*c[i];
else
if(x>=y)return (res-x)+(x-y+1)*b[i]+(ff(x)-ff(y-1))*c[i];
else return res-y+1;
}
inline void dfs(int u){
f[u]=d[u];
for(int i=head[u];i;i=egs[i].nxt){
const int v=egs[i].v;
if(fa[u]==v)continue;fa[v]=u;
f[u]=min(f[u],f[v]-1);dfs(v);
}
}
inline bool calc(int res){day=0;
day=res-n;
for(int i=1; i<=n; ++i){
int l=1,r=res,mid;
while(l<r){
mid=l+(r-l>>1);
if(qry(i,mid,res)<a[i])r=mid;
else d[i]=mid,l=mid+1;
}
}dfs(1);
priority_queue<node>qu;
qu.push((node){f[1],1});
while(!qu.empty()){
int u=qu.top().u;qu.pop();++day;
if(f[u]<day)return 0;
for(int i=head[u]; i; i=egs[i].nxt){
const int v=egs[i].v;
if(v==fa[u])continue;
qu.push((node){f[v],v});
}
}return 1;
}
signed main(){
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n;int u,v;
for(int i=1; i<=n; ++i)
cin>>a[i]>>b[i]>>c[i];
for(int i=1; i<n; ++i)
cin>>u>>v,add(u,v),add(v,u);
int l=1,r=1e9,mid;
while(l<r){
mid=l+(r-l>>1);
if(!calc(mid))l=mid+1;
else ans=r=mid;
}
cout<<ans;
return 0;
}