思路:对于满足条件的r,max(hl ,hl+1 ,hl+2 ,......,hr )<=t(也就是hr<=t)且∑hi<=t*m。所以通过这个条件二分找出最大的r。
二分的下界为1,上界为使得hi等于t的i(hi=t ==> a+(i-1)*b=t ==> i=(t-a)/b+1)
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mem(a,b) memset((a),(b),sizeof(a)) const int N=1e6+5; int a,b,n; int l,t,m; ll cal(int i){return (ll)a+(ll)(i-1)*b;} bool check(ll r) { if((cal(l)+cal(r))*(r-l+1)/2>(ll)m*t)return false; return true; } int main() { scanf("%d%d%d",&a,&b,&n); while(n--) { scanf("%d%d%d",&l,&t,&m); if(cal(l)>t)printf("-1 "); else { ll L=l,R=(t-a)/b+1,m=(L+R)>>1; while(L<=R) { if(check(m))L=m+1; else R=m-1; m=(L+R)>>1; } printf("%d ",m); } } return 0; }