Codeforces 448 D. Multiplication Table 二分

题目链接:D. Multiplication Table

题意:

  给出N×M的乘法矩阵要你求在这个惩罚矩阵中第k个小的元素(1 ≤ n, m ≤ 5·10^5; 1 ≤ k ≤ n·m).

题解:

  n和m最大都是5e5那矩阵最大就有2e11不能够暴力,其实这里就应该想到要用二分做的,但是我做题的时候脑抽@。@想要推规律,然后就决决了。那么讲一下二分怎么做,就先简单的二分答案在(1-n*m)中二分,然后cheak函数中找所有矩阵中比所给值小的元素,个数大于等于k为成立条件。复杂度(O(n*log(n×m)));

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int MAX_N = 5e5+9;
 4 long long vec[MAX_N];
 5 long long N,M,T;
 6 bool cheak(long long x)
 7 {
 8     long long sum = 0;
 9     for(long long i=1;i<=N;i++)
10     {
11         //cout<<"!!!!!"<<x/i<<endl;
12         sum += min(x/i,M);
13     }
14     if(sum < T)return true;
15     else return false;
16 }
17 int main()
18 {
19 
20     while(cin>>N>>M>>T)
21     {
22         long long l=1,r=N*M;
23         while(l<=r)
24         {
25             long long mid = (l+r)/2;
26             //cout<<"....."<<mid<<endl;
27             if(cheak(mid))
28             {
29                 l = mid+1;
30             }
31             else
32             {
33                 r = mid-1;
34             }
35         }
36         long long ans = l;
37         cout<<ans<<endl;
38     }
39     return 0;
40 }

 

 
posted @ 2018-01-25 08:21  会打架的程序员不是好客服  阅读(178)  评论(0编辑  收藏  举报