CodeForces 535C Tavas and Karafs —— 二分

时间:2023-03-09 09:17:52
CodeForces 535C Tavas and Karafs —— 二分

  题意:给出一个无限长度的等差数列(递增),每次可以让从l开始的m个减少1,如果某个位置已经是0了,那么可以顺延到下一位减少1,这样的操作最多t次,问t次操作以后从l开始的最长0序列的最大右边界r是多少。

  分析:由题意可以挖掘出两个条件:l~r中最大的值(因为是递增的,即r的值)必定不大于t;同时,t*m要大于或等于这一段的和。那么根据这两个条件进行二分即可。

  细节:二分的右端点inf不能设置的太大,否则第一次的mid可能就会爆long long。

  代码如下:

 #include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
const int N = +;
typedef long long ll; const ll inf = (ll)0x3f3f3f3f; int main()
{
int a,b,n,l,t,m;
scanf("%d%d%d",&a,&b,&n);
while(n--)
{
scanf("%d%d%d",&l,&t,&m);
ll st = l, ed = inf;
ll r = -;
while(st<=ed)
{
ll mid = st + ed >> ;
ll sum = (*a+b*(l+mid-))*(mid-l+)/;
ll maxn = a + b*(mid-);
if(maxn>(ll)t || (ll)m*t < sum)
{
ed = mid - ;
continue;
}
else
{
r = mid;
st = mid + ;
}
}
printf("%I64d\n",r);
}
return ;
}