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)));

 #include<bits/stdc++.h>
using namespace std;
const int MAX_N = 5e5+;
long long vec[MAX_N];
long long N,M,T;
bool cheak(long long x)
{
long long sum = ;
for(long long i=;i<=N;i++)
{
//cout<<"!!!!!"<<x/i<<endl;
sum += min(x/i,M);
}
if(sum < T)return true;
else return false;
}
int main()
{ while(cin>>N>>M>>T)
{
long long l=,r=N*M;
while(l<=r)
{
long long mid = (l+r)/;
//cout<<"....."<<mid<<endl;
if(cheak(mid))
{
l = mid+;
}
else
{
r = mid-;
}
}
long long ans = l;
cout<<ans<<endl;
}
return ;
}
 
上一篇:Oracle 身份证校验


下一篇:Nginx安装与代理