POJ 3685 二分套二分

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 ≤ MN × 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


刚看到题的时候依旧一脸懵逼,不知道从哪开始下手,还是向大佬的题解妥协了

式子是关于i单调递增的(求偏导……都会得……嗯……)然后,找突破口

先二分答案x,然后二分的去找每行<x的个数,根据小于x的个数来调整x的大小。。。——二分套二分……

#include<iostream>
#include<stdio.h>
#include<cmath>
#include<string.h>
#include<algorithm>
typedef long long ll;
using namespace std;
ll n, m,t;
bool judge(ll a, ll b,ll c)
{
    return (a*a + 100000*a + b*b - 100000*b + a*b)<c;
}
bool C(ll x)
{
    ll crt = 0;
    for (int i = 1; i <= n; i++)  //i从1开始
    {
        ll le = 0, r = n + 1;
        while (le<r-1)  //找没行多少个小于mid的
        {
            ll mi = (r + le) /2 ;
            if (judge(mi, i, x)) le = mi;
            else r = mi;
        }
        crt += le;
    }
    return crt < m;
}
int main()
{
       scanf("%lld", &t);
        while (t--)
        {
            scanf("%lld%lld",&n, &m);
            ll l = -100000*n, h = 3*n*n+100000*n;  //不懂为什么换成inf就WA
            while(h-l>1)
            {
                ll mid = (h + l) / 2;
                if (C(mid)) l = mid;
                else h = mid;
            }
            printf("%lld\n", l);
        }
    return 0;
}
时间: 2024-12-21 06:10:55

POJ 3685 二分套二分的相关文章

POJ-3579 Median---二分第k大(二分套二分)

题目链接: https://cn.vjudge.net/problem/POJ-3579 题目大意: 求的是一列数所有相互之间差值的序列的最中间的值是多少. 解题思路: 可以用二分套二分的方法求解第m大,和POJ-3685类似,这里的模板也差不多 枚举第m大x,判断小于等于x的数目是不是大于m,如果大于m说明x >= 第m大,调整区间r = mid - 1 不然l = mid + 1 此处是大于m而不是小于m是因为一个数可能出现多次,那么小于等于中间的数目可能就比m大 在计算小于等于x的数目的时

POJ 3685 Matrix 二分套二分

POJ 3685 Matrix 二分 题意 有一个N阶方阵,方正中第i行第j列的元素值为\(d_{i,j}=i^{2}+1e5*i+j^{2}-1e5*j+i*j\),我们需要找出这个方阵中第M小的元素值. 解题思路 分析这个公式,我们发现:当j固定的时候,这个公式关于i(取值范围:从0到n)是单调增加的,所以这里我们可以二分一个答案,然后一列一列的找小于(等于)它的个数,这样加起来我们就能知道我们枚举的这个答案是第几小了. 需要注意的是,第一个最外层的二分有点不同,因为我们二分的答案可能不存在

POJ 3685 二分套二分(水题

题意:给出一个N*N的矩阵A,A[i][j]的值等于i2 + 100000 ×i + j2 - 100000 × j + i × j,求这个矩阵中第M小的数 代码: 1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 long long N; 5 long long cal(long long i,long long j){ 6 return i*i+100000*i+j*j-100000*j+i*j

二分套二分 hrbeu.acm.1211Kth Largest

Kth Largest TimeLimit: 1 Second   MemoryLimit: 32 Megabyte Description There are two sequences A and B with N (1<=N<=10000) elements each. All of the elements are positive integers. Given C=A*B, where '*' representing Cartesian product, c = a*b, whe

poj3685 二分套二分

F - 二分二分 Crawling in process... Crawling failed Time Limit:6000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Status 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

51nod 1105---二分套二分

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1105 题意a序列和b序列,ab序列是 a和b两两组合,问你ab中第k大是多少.. 这题是个二分套二分,是个二分好题..为什么好呢,因为这个二分容易写残疾啊...(总之就是我太弱了 接下来分析一下这个题的解法和要注意的地方. 一个显然的方法就是二分答案了,然后判断mid是第几大就可以了.. 但是,仔细一想?咦..会不会二分的答案其实不是ab数组里面的呢?会不会ab里面有很

POJ 3670 Eating Together 二分单调队列解法O(nlgn)和O(n)算法

本题就是一题LIS(最长递增子序列)的问题.本题要求求最长递增子序列和最长递减子序列. dp的解法是O(n*n),这个应该大家都知道,不过本题应该超时了. 因为有O(nlgn)的解法. 但是由于本题的数据特殊性,故此本题可以利用这个特殊性加速到O(n)的解法,其中的底层思想是counting sort分段的思想.就是如果你不会counting sort的话,就很难想出这种优化的算法了. O(nlgn)的单调队列解法,利用二分加速是有代表性的,无数据特殊的时候也可以使用,故此这里先给出这个算法代码

POJ 2263 Heavy Cargo(二分+并查集)

题目地址:POJ 2263 这题是在网上的一篇关于优先队列的博文中看到的..但是实在没看出跟优先队列有什么关系..我用的二分+并查集做出来了... 二分路的载重量.然后用并查集检查是否连通. 代码如下: #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <ctype.h> #

poj 1422 Air Raid (二分匹配)

Air Raid Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6520   Accepted: 3877 Description Consider a town where all the streets are one-way and each street leads from one intersection to another. It is also known that starting from an i