poj3685(嵌套二分)

Matrix

Time Limit: 6000MS   Memory Limit: 65536K
Total Submissions: 4658   Accepted: 1189

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

首先打个表看看,初步认为左下到右上递增。

认真一看,又不是特别有规律,在N比较大时候,递增就木有了。

但是每一列的单调性是可以保持的。这个分别将i,j看成常数求一下导数就非常容易知道了。

这个二分有意思。

在long long 范围内二分一个数X,>号即为 满足X大于矩阵的数大于等于M个

而大于矩阵的数的个数可以通过每一列二分来确定。

时间复杂度log(10^18)*N*log(N)。

#include <iostream>

using namespace std;
long long N, M;
const long long INF = 1LL << 50;
long long mtr ( long long  i, long long j )
{
	return i * i + 100000 * i + j * j - 100000 * j + i * j;
}

bool b_s ( long long X )
{
	long long res = 0;

	for ( int i = 1; i <= N; i++ )
		{
			int cnt = N ;
			int l = 1, r = N;

			while ( l <= r )
				{
					int mid = ( r + l ) >> 1;

					if ( mtr ( mid, i ) >= X )
						{
							r = mid - 1;
							cnt = mid - 1;
						}
					else
						{
							l = mid + 1;
						}
				}

			res += cnt ;
		}
	return res >= M;
}
int main()
{
	int n;
	cin >> n ;
	while ( n-- )
		{
			cin >> N >> M;
			long long l = -INF, r = INF;
			long long ans=-1;

			while ( l <= r )
				{
					long long mid = ( r + l )>>1;
					if ( b_s ( mid ) )
						{
							r = mid - 1;
							ans = mid - 1;
						}
					else
						{
							l = mid + 1;
						}
				}

			cout <<ans << endl;
		}

	return 0;
}
时间: 2024-10-10 01:17:34

poj3685(嵌套二分)的相关文章

POJ3685 Matrix(嵌套二分)

同行元素递减,同列元素递增,采用嵌套二分的方法 #include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> #include<string> #include<algorithm> #include<map> #include<queue> #include<vector> #include<cmath>

poj3685 Matrix 二分 函数单调性

  Memory Limit: 65536K Total Submissions: 4637   Accepted: 1180 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 smalles

WHY吃糖果 QDUOJ 二分嵌套

WHY吃糖果 QDUOJ 二分嵌套 原题链接 解题思路参考链接 题意 给出一个\(n*n\)的矩阵,每个格子的权值为\(i*i+j*j+i*j+100000*(i-j)\),求该矩阵中第m小的权值为多少 解题思路 当列数固定时,这个函数是随着行数的增加而增加的(二次函数简单判断下就行),于是外层的二分进行二分答案,里面的二分进行判断小于等于当前答案的格子有多少个.这样就可以解决问题.参考大佬的思路,可以点击查看. 代码实现 #include<cstdio> #include<cstrin

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

集合详解(五):集合嵌套与Collections工具类

一.集合嵌套 1.HashMap嵌套HashMap <span style="font-size:18px;"> /* * HashMap嵌套HashMap * * 传智播客 * jc 基础班 * 陈玉楼 20 * 高跃 22 * jy 就业班 * 李杰 21 * 曹石磊 23 * * 先存储元素,然后遍历元素 */ public void test3(){ // 创建集合对象 HashMap<String, HashMap<String, Integer>

【矩阵快速幂】HDU 4549 : M斐波那契数列(矩阵嵌套)

[题目链接]click here~~ [题目大意] M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a, b, n,你能求出F[n]的值吗?对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n]对1000000007取模后的值即可,每组数据输出一行. [Source] :2013金山西山居创意游戏程序挑战赛――初赛(2) [解题思路] 这个题稍微有点难度,就

kuangbin带你飞 匹配问题 二分匹配 + 二分图多重匹配 + 二分图最大权匹配 + 一般图匹配带花树

二分匹配:二分图的一些性质 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图. 1.一个二分图中的最大匹配数等于这个图中的最小点覆盖数 König定理是一个二分图中很重要的定理,它的意思是,一个二分图中的最大匹配数等于这个图中的最小点覆盖数.如果你还不知道什么是最小点覆盖,我也在这里说一下:假如选

Nested Dolls (单调递增子序列 + 二分)

Description Dilworth is the world's most prominent collector of Russian nested dolls: he literally has thousands of them! You know, the wooden hollow dolls of different sizes of which the smallest doll is contained in the second smallest, and this do

UVA 11368 &amp; POJ 3636 &amp; HDU 1677 Nested Dolls(贪心 + 二分LIS)

A - Nested Dolls Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description Dilworth is the world's most prominent collector of Russian nested dolls: he literally has thousands of them! You know, the wooden hollow dolls