CF Tavas and Karafs (二分)
Karafs is some kind of vegetable in shape of an 1 × h rectangle. Tavaspolis people love Karafs and they use Karafs in almost any kind of food. Tavas, himself, is crazy about Karafs.
Each Karafs has a positive integer height. Tavas has an infinite 1-based sequence of Karafses. The height of the i-th Karafs is si = A + (i - 1) × B.
For a given m, let's define an m-bite operation as decreasing the height of at most m distinct not eaten Karafses by 1. Karafs is considered as eaten when its height becomes zero.
Now SaDDas asks you n queries. In each query he gives you numbers l, t and m and you should find the largest number r such that l ≤ r and sequence sl, sl + 1, ..., sr can be eaten by performing m-bite no more than t times or print -1 if there is no such number r.
The first line of input contains three integers A, B and n (1 ≤ A, B ≤ 106, 1 ≤ n ≤ 105).
Next n lines contain information about queries. i-th line contains integers l, t, m (1 ≤ l, t, m ≤ 106) for i-th query.
For each query, print its answer in a single line.
2 1 4
1 5 3
3 3 10
7 10 2
6 4 8
4
-1
8
-1
1 5 2
1 5 10
2 7 4
1
2
今天才发现比赛时候的算法是对的。。。只不过数据爆了,改成long long就过了,还重新找题解写了一次。。。。
不过新写的更快一点,130ms,二分查找,下界为L,二分查上界,上界的初始值可以算出来。
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <cstdio> 5 #include <ctime> 6 using namespace std; 7 8 long long bsearch(long long,long long,long long); 9 10 long long A,B; 11 int main(void) 12 { 13 long long l,t,m,r; 14 long long n; 15 16 scanf("%lld%lld%lld",&A,&B,&n); 17 while(n --) 18 { 19 scanf("%lld%lld%lld",&l,&t,&m); 20 if(t < A + (l - 1) * B) 21 { 22 puts("-1"); 23 continue; 24 } 25 r = bsearch(l,t,m); 26 printf("%lld\n",r); 27 } 28 29 return 0; 30 } 31 32 long long bsearch(long long l,long long t,long long m) 33 { 34 long long low = l; 35 long long high = (t - A) / B + 1; 36 37 while(low <= high) 38 { 39 long long mid = (low + high) / 2; 40 long long box = (A + (l - 1) * B + A + (mid - 1) * B) * (mid - l + 1) / 2; 41 42 if(box <= m * t) 43 low = mid + 1; 44 else 45 high = mid - 1; 46 } 47 48 return low - 1; 49 }