CF 535C Tavas and Karafs
题目大意:给你一个无限长的等差数列,每次给一个起点L,可以吃T轮,每可以把M个数吃一口(-1),问最大的R使得区间[L,R]被吃完
思路:显然给定一个区间[L,R]后很容易贪心出能不能被吃完,并且发现该性质有单调性也就是如果[L,R]可以吃完,那[L,R-1]也可以,且存在最大的R使得[L,R+1]不满足条件,于是二分一下就可以了
1 #include<iostream> 2 #include<cstdio> 3 #define ll long long 4 using namespace std; 5 ll a,b,n,l,t,m,rr,lr; 6 int check(ll k) 7 { 8 ll f = a + (l - 1) * b,rrr = a + (k - 1) * b,su=((f+rrr)*(k-l+1))>>1; 9 if(t*m<su || rrr > t)return 0; 10 else return 1; 11 } 12 int main() 13 { 14 cin>>a>>b>>n; 15 for(int i=1;i<=n;i++) 16 { 17 cin>>l>>t>>m; 18 if(a+b*(l-1) > t) 19 { 20 puts("-1"); 21 continue; 22 } 23 lr = l; 24 rr = l + t+10; 25 while(lr<rr) 26 { 27 int mid = (lr + rr+ 1) >> 1; 28 if(check(mid))lr=mid;else rr=mid-1; 29 } 30 cout<<lr<<endl; 31 } 32 return 0; 33 }