zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    dns解析后ping的居然不是自己的ip
    Ubuntu修改默认使用的bash
    安装 libbpg
    libnccl安装
    安装opencv
    tcpdump使用
    jQuery类操作
    jQuery对象和DOM对象的相互转换
    jQuery入口函数
    什么是外边距重叠?重叠的结果是什么?
  • 原文地址:https://www.cnblogs.com/Fighting-sh/p/10075115.html
Copyright © 2011-2022 走看看