题目链接:Problem - 448D - Codeforces
题意:
给你一个n*m的矩阵,矩阵中的元素是行列的积,给你一个k值,求这个矩阵中元素的第k小的值是什么。(其中1<=n,m<=5*10e5;1<=k<=n*m)
思路:
在1~n*m的范围里找排在第k个的树是连续的并且是由单调性的,可以用二分法(其实从数据范围也可以考虑到要用到二分)。题目给出元素值n*m,就是要求出mid前有多少个数,只要知道每行有多少小于等于mid的数就好了
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string.h>
using namespace std;
typedef long long int ll;
const int mm = 2e5 + 10;
void solve()
{
ll n, m;
ll k;
cin >> n >> m >> k;
ll r = n * m, l = 1, ans;
while (r > l) {
ll mid = (r + l) / 2;
ll t = 0;
for (int i = 1; i <= n; i++) t += min(m, mid / i);
if (t >= k) r = mid;
if (t < k)l = mid + 1;
}
cout << r << endl;
}
int main()
{
int t = 1;
//cin >> t;
while (t--)
{
solve();
}
return 0;
}