http://poj.org/problem?id=3685
题意:
给你n*n的矩阵,每个元素(i,j)=.
给你n,m,问你在n*n的矩阵里第m小的元素是多少。
POINT:
可知,确定了j=k之后,元素(i,k)具有单调性,i越大,元素越大。
所以我们二分答案,然后for循环遍历j,二分确定一个i是<=答案的。就知道对于这个j有 i个元素小于答案。
把他们累加起来,和m比较。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <bitset>
using namespace std;
const int maxn = 10000+33;
#define LL long long
LL n,m;
bool check(LL x)
{
LL cnt=0;
for(LL j=1; j<=n; j++)
{
LL l=1,r=n;
LL ans=0;
while(l<=r)
{
LL mid=(l+r)>>1;
long long val=mid*mid+100000*mid+j*j-100000*j+mid*j;
if(val<=x)
{
ans=mid;
l=mid+1;
}
else
r=mid-1;
}
cnt+=ans;
}
if(cnt>=m)
{
return false;
}
else
return true;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
LL out=0;
scanf("%lld%lld",&n,&m);
LL l=-100000*n,r=n*n+100000*n+n*n+n*n;
while(l<=r)
{
LL mid = (l+r)>>1;
if(check(mid))
l=mid+1;
else
{
out=mid;
r=mid-1;
}
}
printf("%lld\n",out);
}
return 0;
}