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
POJ Founder Monthly Contest – 2008.08.31, windy7926778
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 }
posted on 2018-12-06 10:04 Fighting_sh 阅读(287) 评论(0) 编辑 收藏 举报