Codeforces 448 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 }