#include<bits/stdc++.h>
#define int long long
int n,a[100005],b[100005],c[100005];
int dis[100005];
bool vis[22],Cang[22];
bool fl=0,fl2=0;
int Dfsans=0;
std::vector<int>G[100005];
struct node {
public:
int id,val;
bool operator <(node b)const {
return b.val<this->val;
}
} p[100005];
int GetAns(int x,int y) {
int l=1,r=x,ans;
while(l<=r) {
int mid=(l+r)>>1;
if(y*mid+x<=0)ans=mid,r=mid-1;
else l=mid+1;
}
return ans;
}
signed main() {
scanf("%lld",&n);
for(int i=1; i<=n; i++) {
scanf("%lld%lld%lld",&a[i],&b[i],&c[i]);
if(c[i]!=0)fl=1;
}
for(int i=1; i<n; i++) {
int u,v;
scanf("%lld%lld",&u,&v);
if(u!=v-1)fl2=1;
G[u].push_back(v);
}
int ans=0;
for(int i=1; i<=n; i++) {
if(c[i]>=0) {
int l=1,r=1000000000,aans=0;
while(l<=r) {
int mid=(l+r)>>1;
int hig=b[i]*(mid-i+1)+c[i]*((i+mid)*(mid-i+1)>>1);
if(hig>=a[i])aans=mid,r=mid-1;
else l=mid+1;
}
ans=std::max(aans,ans);
} else {
int Sj=GetAns(b[i],c[i]);
int l=1,r=1000000000,aans=0;
while(l<=r) {
int mid=(l+r)>>1;
int hig;
if(mid>=Sj)hig=b[i]*(Sj-i)+(mid-(Sj-1)-(i-1));
else hig=b[i]*(mid-i+1)+c[i]*((i+mid)*(mid-i+1)>>1);
if(hig>=a[i])aans=mid,r=mid-1;
else l=mid+1;
}
ans=std::max(aans,ans);
}
}
printf("%lld",ans);
return 0;
}
为什么洛谷一分不得,测了几组特殊性质 B 都没挂。