Binary search application
当时比赛想了二分,二分没用在刀刃上。我只对前缀和和tm的比较做了二分,而没有加t>=a+(mid-1)b 这个条件二分
当时二分了一个位置,然后从这里往后遍历到L来找maxR, 结果算法是错的。
适合做知道二分,但是写个bug free的 代码,不适合做应用
c1=t>=a+(mid-1)b, c2=sum[mid]-sum[L-1]<=tm,
这道题目, if(c1 && c2)l=mid else r=mid-1,
这种一开始写只从len=3开始规约,len=3->1,2, len=2->2,-1
结果发现有一个错了,后来发现len=4->1,3, 因此外部长度判断应该放到while(len>=1), 这里先入为主是因为看了kuangbin的代码影响。
所以规约应该最多要考虑到len=4在某些情况下例如此处。
附上代码:
LL sum[maxn];
int main()
{
#ifndef ONLINE_JUDGE
//freopen ("in.txt" , "r" , stdin);
//freopen ("out.txt" , "w" , stdout);
#endif
LL a, b, n, l, t, m, L;
while(cin>>a>>b>>n)
{
sum[0]=0;//sumi: A+...+A+(i-1)B
for(int i=1;i<=maxn;i++) sum[i]=sum[i-1]+a+(i-1)*b;
for(int i=0;i<n;i++)
{
cin>>L>>t>>m;
int l=L,r=maxn;
int ans=-1;
while(l<=r)
{
if(l+1==r || l==r)
{
//cout<<"l r:"<<l<<" "<<r<<endl;
if(t>=a+(r-1)*b && sum[r]-sum[L-1]<=t*m) ans=r;
else if(t>=a+(l-1)*b && sum[l]-sum[L-1]<=t*m) ans=l;
break;
}
int mid=(l+r)/2;
if(t>=a+(mid-1)*b && sum[mid]-sum[L-1]<=t*m) l=mid;
else r=mid-1;
}
cout<<ans<<endl;
}
}
return 0;
}