将39行改成40行就T掉了,但是不管return什么都是log的吧
#include<iostream>
#include<cstdio>
#include<vector>
#define pb push_back
#include<algorithm>
using namespace std;
namespace INPUT{
char buf[1<<20],*p1,*p2;
#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
}
using namespace INPUT;
template<typename T>
T read(){
T x=0,p=1;
char ch=gc();
for(;ch<'0'||ch>'9';ch=gc())
if(ch=='-') p=-1;
for(;'0'<=ch&&ch<='9';ch=gc())
x=(x<<3)+(x<<1)+(ch^48);
return x*p;
}
#define ll long long
#define INF (ll)(1e9+105)
const int N=1e5+5;
vector<int>G[N];
void add(int u,int v){G[u].pb(v),G[v].pb(u);}
int fa[N];
void dfs0(int u,int f){
for(auto v:G[u]) v!=f?(dfs0(v,u),fa[v]=u):(false);
}
int n;
ll a[N],b[N],c[N],z[N];
bool checkA(ll l,ll r,int i){
if(l>=z[i]) return r-l+1>=a[i];
ll res=0;
if(r>=z[i]) res+=r-z[i]+1,r=z[i]-1;
if(res>=a[i]) return true;
max(b[i]+l*c[i],1ll)+max(b[i]+r*c[i],1ll)>(((a[i]-res)<<1)-1)/(r-l+1);
// return max(b[i]+l*c[i],1ll)+max(b[i]+r*c[i],1ll)>(((a[i]-res)<<1)-1)/(r-l+1);
}
ll calc(int i,ll D){
ll l=0,r=D,mid;
while(l<=r){
mid=(l+r)>>1;
if(checkA(mid,D,i)) l=mid+1;
else r=mid-1;
}
return r;
}
int id[N];
bool used[N];
ll Less[N];
bool check(ll D){
used[0]=true;
for(int i=1;i<=n;i++) Less[i]=calc(i,D);
for(int i=1;i<=n;i++) id[i]=i,used[i]=false;
sort(id+1,id+1+n,[](int x,int y){
return Less[x]<Less[y];
});
int Now=0;
for(int i=1;i<=n;i++){
int u=id[i];
while(!used[u]) used[u]=true,u=fa[u],Now++;
if(Now>Less[id[i]]) return false;
}
return true;
}
int main(){
// freopen("tree.in","r",stdin);
// freopen("tree.out","w",stdout);
n=read<int>();
for(int i=1;i<=n;i++){
a[i]=read<ll>(),b[i]=read<int>(),c[i]=read<int>();
if(c[i]<0) z[i]=(b[i]-c[i]-1)/(-c[i]);
else z[i]=INF+1;
}
for(int i=1;i<n;i++) add(read<int>(),read<int>());
dfs0(1,0);
ll l=0,r=1e9+5,mid;
while(l<=r){
mid=(l+r)>>1;
if(check(mid)) r=mid-1;
else l=mid+1;
}
printf("%lld\n",l);
}