Matrix(二分套二分)

Matrix

http://poj.org/problem?id=3685

Time Limit: 6000MS   Memory Limit: 65536K
Total Submissions: 8943   Accepted: 2738

Description

Given a N × N matrix A, whose element in the i-th row and j-th column Aij is an number that equals i2 + 100000 × i + j2 - 100000 × j + i × j, you are to find the M-th smallest element in the matrix.

Input

The first line of input is the number of test case.
For each test case there is only one line contains two integers, N(1 ≤ N ≤ 50,000) and M(1 ≤ M ≤ N × N). There is a blank line before each test case.

Output

For each test case output the answer on a single line.

Sample Input

12

1 1

2 1

2 2

2 3

2 4

3 1

3 2

3 8

3 9

5 1

5 25

5 10

Sample Output

3
-99993
3
12
100007
-199987
-99993
100019
200013
-399969
400031
-99939

Source

 

 

 

 1 #include <cstring>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <algorithm>
 5 #include <iostream>
 6 typedef long long ll;
 7 using namespace std;
 8 
 9 ll n,k;
10 ll cal(ll i,ll j){
11     return i*i+100000*i+j*j-100000*j+i*j;
12 }
13 
14 bool Check(ll num){
15     ll sum=0;
16     for(ll i=1;i<=n;i++){
17         ll L=1,R=n,mid;
18         while(L<=R){
19             mid=L+R>>1;
20             if(cal(mid,i)<=num){
21                 L=mid+1;
22             }
23             else{   
24                 R=mid-1;
25             }
26         }
27         sum+=R;
28     }
29     return sum>=k;
30 }
31 
32 int main(){
33 
34     int T;
35     cin>>T;
36     while(T--){
37        cin>>n>>k;
38        ll L=-1e18,R=1e18,mid;
39        while(L<=R){
40            mid=L+R>>1;
41            if(Check(mid)){
42                R=mid-1;
43            }
44            else{
45                L=mid+1;
46            }
47        }
48        cout<<L<<endl;
49     }
50 
51 }
View Code

 

posted on 2018-12-06 10:04  Fighting_sh  阅读(287)  评论(0编辑  收藏  举报

导航