大概是熬夜熬到脑子都不清醒了,废了九牛二虎之力才好不容易看懂题意,结果还是没做出来。
题意:一个等差数列,一次可以把m个数减一,有t次机会,问能使sl,sl+1,...,sr都为0的最大r。
思路:因为是一个递增的等差数列,而且可以推出,[l,r]中最大的h小于等于t,由此可以确定右边界,sum[l,r]小于等于t*m,由此可以
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<vector>
#include<cmath>
#include<ctime>
#define mx 200005
#define LL long long
#define mod 1000000009
#define esp 1e-12
const double PI = acos(-1.0);
using namespace std;
int a, b, n, l, t, m;
LL getv(LL p)
{
return a + (p - 1) * b;
}
LL getsum(LL r)
{
return (getv(r) + getv(l)) * (r - l + 1) / 2;
}
int main()
{
cin >> a >> b >> n;
while (n--)
{
cin >> l >> t >> m;
if (getv(l) > t) cout << "-1\n";
else
{
LL le = l, ri = (t - a) / b + 1, mid;
while (le <= ri)
{
mid = (ri + le) / 2;
if (getsum(mid) <= t * m) le = mid + 1;
else ri = mid - 1;
}
cout << le - 1 << endl;
}
}
return 0;
}
二分答案。