poj 3685 Matrix(二分搜索之查找第k大的值)
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 + × i + j2 - × 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( ≤ N ≤ ,) and M( ≤ 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
Sample Output
- -
- - -
Source
题目大意:题目意思很简单。这个题目乍一看,先打n为比较小例如8的表,会觉得很有规律,大小规律是从右上往左下依次增大,但是这个规律到n为5*10^4就不一定保持了。
解题思路:有一个规律是看得见的,j不变i增大函数值也在增大。根据这个可以对这n列二分得到<x的值,同样所求的x也是可以二分慢慢靠近最后的结果,我处理得到最后的结果是个数为m+1的最小值,所以最后mid-1即为答案。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<math.h>
#include<stdlib.h>
using namespace std;
#define inf 1<<30
#define ll long long
#define N 50006
ll n,m;
ll cal(ll i,ll j){
return i*i+*i+j*j-*j+i*j;
}
bool solve(ll mid){
ll cnt=;
for(ll j=;j<=n;j++){
ll low=;
ll high=n+;
while(low<high){
ll tmp=(low+high)>>;//另外的写法
ll ans=cal(tmp,j);
if(ans>=mid){
high=tmp;
}
else{
low=tmp+;
}
}
cnt+=low-;//另外的写法
}
if(cnt>=m) return true;
return false;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){ scanf("%I64d%I64d",&n,&m);
ll low=-1e12;
ll high=1e12; while(low<high){
ll mid=(low+high)>>;//另外的写法
if(solve(mid)){
high=mid;
}
else{
low=mid+;
}
}
printf("%I64d\n",low-);//另外的写法 }
return ;
}
另外的写法,试比较
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<math.h>
#include<stdlib.h>
using namespace std;
#define inf 1<<30
#define ll long long
#define N 50006
ll n,m;
ll cal(ll i,ll j){
return i*i+*i+j*j-*j+i*j;
}
bool solve(ll mid){
ll cnt=;
for(ll j=;j<=n;j++){
ll low=;
ll high=n+;
ll tmp=(low+high)>>;
while(low<high){
ll ans=cal(tmp,j);
if(ans>=mid){
high=tmp;
}
else{
low=tmp+;
}
tmp=(low+high)>>;
}
cnt+=tmp-;
}
if(cnt>=m) return true;
return false;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){ scanf("%I64d%I64d",&n,&m);
ll low=-1e12;
ll high=1e12;
ll mid=(low+high)>>;
while(low<high){
if(solve(mid)){
high=mid;
}
else{
low=mid+;
}
mid=(low+high)>>;
}
printf("%I64d\n",mid-); }
return ;
}
poj 3685 Matrix(二分搜索之查找第k大的值)的更多相关文章
- poj 3579 Median (二分搜索之查找第k大的值)
Description Given N numbers, X1, X2, ... , XN, let us calculate the difference of every pair of numb ...
- 查找第K大的值
这种题一般是给定N个数,然后N个数之间通过某种计算得到了新的数列,求这新的数列的第K大的值 POJ3579 题意: 用$N$个数的序列$x[i]$,生成一个新序列$b$. 新的序列定义为:对于任意的$ ...
- POJ 3579 3685(二分-查找第k大的值)
POJ 3579 题意 双重二分搜索:对列数X计算∣Xi – Xj∣组成新数列的中位数 思路 对X排序后,与X_i的差大于mid(也就是某个数大于X_i + mid)的那些数的个数如果小于N / 2的 ...
- POJ_3685_Matrix_(二分,查找第k大的值)
描述 http://poj.org/problem?id=3685 一个n*n的矩阵,(i,j)的值为i*i+100000*i+j*j-100000*j+i*j,求第m小的值. Matrix Time ...
- poj 2579 中位数问题 查找第K大的值
题意:对列数X计算∣Xi – Xj∣组成新数列的中位数. 思路:双重二分搜索 对x排序 如果某数大于 mid+xi 说明在mid后面,这些数的个数小于 n/2 的话说明这个中位数 mid 太大 反之太 ...
- POJ_3579_Median_(二分,查找第k大的值)
描述 http://poj.org/problem?id=3579 给你一串数,共C(n,2)个差值(绝对值),求差值从大到小排序的中值,偶数向下取. Median Time Limit: 1000M ...
- 基于快速排序思想partition查找第K大的数或者第K小的数。
快速排序 下面是之前实现过的快速排序的代码. function quickSort(a,left,right){ if(left==right)return; let key=partition(a, ...
- 如何用快排思想在O(n)内查找第K大元素--极客时间王争《数据结构和算法之美》
前言 半年前在极客时间订阅了王争的<数据结构和算法之美>,现在决定认真去看看.看到如何用快排思想在O(n)内查找第K大元素这一章节时发现王争对归并和快排的理解非常透彻,讲得也非常好,所以想 ...
- 利用划分树求解整数区间内第K大的值
如何快速求出(在log2n的时间复杂度内)整数区间[x,y]中第k大的值(x<=k<=y)? 其实我刚开始想的是用快排来查找,但是其实这样是不行的,因为会破坏原序列,就算另外一个数组来存储 ...
随机推荐
- Android 打造任意层级树形控件 考验你的数据结构和设计
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40212367,本文出自:[张鸿洋的博客] 1.概述 大家在项目中或多或少的可能会 ...
- 支持多QQ登录的软件
支持多QQ登录,批量加好友,批量回复QQ消息,当然也能接收 下载链接:多QQ登录软件
- vmware下给linux添加硬盘
http://blog.csdn.net/robbie1314520/archive/2010/08/10/5802724.aspx 创建虚拟硬盘 1.关闭VM中正在运行的虚拟系统: 2.EDIT V ...
- React初步
今天整理一下自己关于react的学习笔记. 什么是React? 学习某一个框架首先得知道这个框架是干什么的,它的特点是什么,有哪些优点和缺点. React有4个特点 组件化 虚拟DOM 单项数据流 j ...
- Code First 数据注释--DatabaseGenerated
EF中可以使用DatabaseGenerated设置数据库字段的属性,它有三个枚举值:Computed.None.Identity Computed 表示这一列是计算所得 None 不做处理 Iden ...
- C#重写Equals方法步骤
检查传入的参数是否为null, 如果为null,那么返回false, 否则执行步骤2 调用ReferenceEquals查看是否为统一个对象,如果是,那么返回true, 否则执行步骤3 判断两者是否为 ...
- Struts2+Spring3+Hibernate3+Maven构建(基于Eclipse)
长时间不做后台了,整理一下资料,以便翻阅. Eclipse.JDK安装略…… Maven下载地址:http://maven.apache.org/download.cgi 版本比较新的Eclipse基 ...
- hdu3714 三分
Error Curves Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- CDialog类中OnCancel()、OnInitDialog()作用
1.void CCOMDDlg::OnCancel() { // TODO: Add extra cleanup here CDialog::OnCancel();} 如果把CDialog::OnCa ...
- 新建一个vs2010的MFC工程
1.在新建mfc工程时Visual C++下的MFC MFC ActiveX Control用来生成MFC ActiveX控件程序 MFC Application用来生成MFC应用程序. MFC DL ...