下面代码相当于题解中包含 clac 函数的二分(即求标题所说的东西),mid 含义如标题所示, ai,bi,ci 如题目所示,c0 表示当 ci<0 时最靠后的满足树长得高度大于等于 1 米的日期。我对照了第一篇题解(我的 md,mid,c0 分别和题解的 l,r,T 差不多),不知道我这么写为什么不对(尽管这里可能写对了,如果这里我写对了记得给我说一声),求调,谢谢!
for(int i=1;i<=n;i++) {
t[i].x=i;
if(c[i]>=0) {
long long l=1,r=mid,md;
while(l<=r) {
md=(l+r)/2;
if(c[i]*(md+mid)/inf*(mid-md+1)>inf||b[i]*(mid-md+1)+c[i]*(md+mid)*(mid-md+1)/2>=a[i]) l=md+1;
else r=md-1;
}
if(!r) return false;
t[i].y=r;
}
else {
long long c0=(b[i]-1)/(-c[i]);
if(mid<=c0) {
long long l=1,r=mid,md;
while(l<=r) {
md=(l+r)/2;
if(b[i]*(mid-md+1)+c[i]*(md+mid)*(mid-md+1)/2<a[i]) r=md-1;
else l=md+1;
}
if(!r) return false;
t[i].y=r;
} else {
if(a[i]<=mid-c0) t[i].y=mid-a[i]+1;
else {
long long l=1,r=c0,md;
while(l<=r) {
md=(l+r)/2;
if(b[i]*(c0-md+1)+c[i]*(md+c0)*(c0-md+1)/2+mid-c0<a[i]) r=md-1;
else l=md+1;
}
if(!r) return false;
t[i].y=r;
}
}
}
}