Description

有一个N阶方阵 第i行,j列的值Aij =i2 + 100000 × i + j2 - 100000 × j + i × j,需要找出这个方阵的第M小值.

Input

第一行输入T代表测试组数.
每个测试用例包含2个数字N,M表示在N阶方阵找出第M大值, N(1 ≤ N ≤ 50,000) and M(1 ≤ M≤ N × N). 每两个测试用例之间可能有空行


Output

输出方阵的第M小值

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

Analysis

在二分m的大小之后,再次二分统计小于等于m的个数,但是可以有两个方向

我真的好蠢,调了一个下午...方向不太好

下面两个函数是等价的,一个关于i,一个关于j

f(i)=i2+(100000+j)×i+j2-100000×j

f(j)=j2+(i-100000)×j+i2+100000×i)

我们发现第一个函数的对称轴小于0,也就是在[1,n]的区间上是单调的,而第二个函数对称轴是有可能在[1,n]区间里的,所以要分类讨论

我就是写的第二种...所以有一点...

Code

 #include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define RG register ll
#define rep(i,a,b) for(RG i=a;i<=b;++i)
#define per(i,a,b) for(RG i=a;i>=b;--i)
#define ll long long
#define inf (1<<29)
#define cal(x,y) (y*y+(x-100000ll)*y+x*x+100000ll*x)
using namespace std;
ll T;
ll n,m;
inline ll read()
{
ll x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} ll check(ll lim)
{
ll cnt=;
rep(i,,n)
{
ll AOF=(100000ll-i)/2ll;//对称轴
if(n<=AOF)
{
ll l=,r=n,mid,num,ans=;
while(l<=r)
{
mid=l+r>>,num=cal(i,mid);
if(num>lim) ans=mid,l=mid+;
else r=mid-;
}
cnt+=n-ans;
}
else
{
ll l=,r=AOF,mid,num,ans=;
while(l<=r)
{
mid=l+r>>,num=cal(i,mid);
if(num>lim) ans=mid,l=mid+;
else r=mid-;
}
cnt+=AOF-ans;//bug! l=AOF+,r=n,mid,num,ans=AOF;
while(l<=r)
{
mid=l+r>>,num=cal(i,mid);
if(num<=lim) ans=mid,l=mid+;
else r=mid-;
}
cnt+=ans-AOF;
}
}
return cnt>=m;
} int main()
{
T=read();
while(T--)
{
n=read(),m=read();
ll l=cal(1ll,n),r=max(cal(n,1ll),cal(n,n)),mid,ans;
while(l<=r)
{
mid=l+r>>;
if(check(mid)) ans=mid,r=mid-;
else l=mid+;
}
printf("%lld\n",ans);
}
return ;
}

Matrix [POJ3685] [二分套二分]的更多相关文章

  1. poj 3685 Matrix 二分套二分 经典题型

    Matrix Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 5724   Accepted: 1606 Descriptio ...

  2. poj3579 二分套二分

    和poj3685类似,都是二分答案然后在判断时再二分 这题的内层二分可以用stl代替 /* 二分套二分,思路:升序排序数据,先二分答案x进行判断,判断时枚举每个元素,二分找到和其之差小于等于x的所有值 ...

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

    题目链接: https://cn.vjudge.net/problem/POJ-3579 题目大意: 求的是一列数所有相互之间差值的序列的最中间的值是多少. 解题思路: 可以用二分套二分的方法求解第m ...

  4. poj 3579 Median 二分套二分 或 二分加尺取

    Median Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5118   Accepted: 1641 Descriptio ...

  5. poj3685 二分套二分

    F - 二分二分 Crawling in process... Crawling failed Time Limit:6000MS     Memory Limit:65536KB     64bit ...

  6. POJ 3685 Matrix (二分套二分)

    Matrix Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 8674   Accepted: 2634 Descriptio ...

  7. Matrix (二分套二分

    Given a N × N matrix A, whose element in the i-th row and j-th column Aij is an number that equals i ...

  8. Matrix(二分套二分)

    Matrix http://poj.org/problem?id=3685 Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 8 ...

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

    Kth Largest TimeLimit: 1 Second   MemoryLimit: 32 Megabyte Description There are two sequences A and ...

随机推荐

  1. Windows 记事本的 ANSI、Unicode、UTF-8 这三种编码模式有什么区别?

    [梁海的回答(99票)]: 简答.一些细节暂无精力查证,如果说错了还请指出. 一句话建议:涉及兼容性考量时,不要用记事本,用专业的文本编辑器保存为不带 BOM 的UTF-8. * * * 如果是为了跨 ...

  2. C#获取根目录的方法总结

    1.控制台应用程序 static void Main(string[] args) { //1.Environment.CurrentDirectory Console.WriteLine(Envir ...

  3. [Android] Android 锁屏实现与总结 (三)

    上接: Android 锁屏实现与总结 (二) 系列文章链接如下: [Android] Android 锁屏实现与总结 (一) [Android] Android 锁屏实现与总结 (二) [Andro ...

  4. 双系统下Ubuntu扩展根目录空间方法

    最近,在Ubuntu16.04上装了个matlab,突然发现根目录空间只剩1G了,这哪儿够用啊,就想着有没有一种方法不用重装系统就可以扩展根目录空间呢?别说还真有,看下文. 开始之前先分出一些未分配空 ...

  5. 一些日期的计算方式 PHP

    一些日期的计算 某个月内的所有天数: public function getMonthDay ($date) { $stattime = strtotime(date('Ym01',strtotime ...

  6. Synchronized 和 Volatile

    Synchronized : 称为重量级锁,经过优化后,也没那么重了 一.CAS 1.CAS:Compare and Swap, 翻译成比较并交换. 2.java.util.concurrent包中借 ...

  7. eclipse工程的jdk从1.7升到1.8后报错解决办法

    报的错误信息: org.apache.jasper.JasperException: Unable to compile class for JSP 讲Tomcat从7.0升到apache-tomca ...

  8. 在Linux中调试段错误(core dumped)

    在Linux中调试段错误(core dumped) 在作比赛的时候经常遇到段错误, 但是一般都采用的是printf打印信息这种笨方法,而且定位bug比较慢,今天尝试利用gdb工具调试段错误. 段错误( ...

  9. Windows7下PHP5.6.19+Apache2.4.18+MySql5.7环境配置

    此安装参考了网上各方资料,最终整理的内容为本次安装涉及的部分. 一.准备安装材料: 1.从http://windows.php.net/download/ 下载5.6.19 线程安全版(使用apach ...

  10. PHP实用工具类

    2018年10月25日 20:21:09 组装SQL语句 适用MySQL, 链式调用, 组装后可传参选择是否查询数据库 项目地址: 码云 生成数据字典 适用MySQL, 链式调用, 可生成word, ...