题意,给你个n*n的矩阵,然后矩阵中的每一个数和行列都有关,然后问第k大个数是什么。
开始的时候//想的太简单,比如(1,4)的关系和(2,5)的关系不知道呀
然后因为列确定了后,行数增加,数也跟着增加。。两个二分,和前面一个题有点像。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
double gg[10000];
long long zz(long long i,long long j)
{
return (long long)(i*i+100000*i+j*j-100000*j+i*j);
}
long long n,m;
int ok(long long mid)
{
long long ans=0;
for(int j=1;j<=n;j++)
{
long long l=1,r=n,num=0;
while(l<=r)
{
long long m=l+(r-l)/2;
if(zz(m,j)<=mid)
{
num=m;
l=m+1;
}
else r=m-1;
}
ans+=num;
}
if(ans>=m) return 1;
else return 0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%I64d %I64d",&n,&m);
long long l=-100000*n,r=3*n*n+n*100000,res=l;
while(l<=r)
{
long long mid=l+(r-l)/2;
if(ok(mid)){
res=mid;
r=mid-1;
}
else {l=mid+1;}
}
printf("%I64d\n",res);
}
return 0;
}