#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1e5+10;
const ll INF=1e9+10;
ll n,a[N],b[N],c[N];
ll head[N],tot;
ll tree[N],tim[N]={0,1},lst[N],minn=INF;
bool vis[N]={0,1};
struct Edge{
ll next,to;
}e[N<<1];
void adde(ll u,ll v){
e[++tot].next=head[u];
e[tot].to=v;
head[u]=tot;
}
void dfs(ll day,ll step){
if(day>minn) return;
if(day>=n){
for(ll i=1;i<=n;i++){
if(c[i]==0){
lst[i]=(a[i]-1)/b[i]+tim[i];
continue;
}
ll now=(1-b[i])/c[i];
if(c[i]<0){
ll pour=(now*b[i])+(now+1)*now/2*c[i];
if(pour<a[i]){
lst[i]=a[i]-pour+now+tim[i]-1;
continue;
}
}
if(c[i]>0) now=1000000000;
ll l=1,r=now,mid=0,ans=INF;
while(l<=r){
mid=(l+r)>>1;
ll check=(mid*b[i])+(mid+1)*mid/2*c[i];
if(check>=a[i]) ans=min(ans,mid),r=mid-1;
else l=mid+1;
}
lst[i]=ans;
}
ll maxn=0;
for(ll i=1;i<=n;i++){
if(lst[i]>maxn) maxn=lst[i];
}
minn=min(minn,maxn);
return;
}
for(ll i=1;i<=n;i++){
if(!vis[i]) continue;
for(ll j=head[i];j;j=e[j].next){
ll v=e[j].to;
if(vis[v]) continue;
vis[v]=1;
tim[v]=step+1;
dfs(day+1,step+1);
vis[v]=0;
}
}
}
int main(){
cin>>n;
for(ll i=1;i<=n;i++){
cin>>a[i]>>b[i]>>c[i];
}
for(ll i=1;i<n;i++){
ll u,v;cin>>u>>v;
adde(u,v);
adde(v,u);
}
dfs(1,1);
cout<<minn<<endl;
return 0;
}
全TLE了,这是为什么?
还有我把 if(lst[i]>maxn) maxn=lst[i];删了就不会TLE了,这又是为什么