POJ 3579 3685(二分-查找第k大的值)
POJ 3579
题意
双重二分搜索:对列数X计算∣Xi – Xj∣组成新数列的中位数
思路
对X排序后,与X_i的差大于mid(也就是某个数大于X_i + mid)的那些数的个数如果小于N / 2的话,说明mid太大了。以此为条件进行第一重二分搜索,第二重二分搜索是对X的搜索,直接用lower_bound实现。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std; int N;
int CN2 = 0;
int X[100005];
bool C(int x) { // 验证x作为中位数 x = X[j] - X[i] 是否太小
int cnt = 0;
for (int i = 0; i<N; ++i) {
cnt += N - (lower_bound(X + i, X + N, X[i] + x) - X); // 统计差值>=x的个数
}
return cnt > CN2 >> 1;
}
void solve() {
sort(X, X + N);
CN2 = N*(N - 1) >> 1;
int lb = 0, ub = 1000000001;
while (ub - lb > 1) {
int mid = (ub + lb) >> 1;
if (C(mid)) lb = mid; // 中位数过小,半闭半开区间[lb, ub)
else ub = mid;
}
printf("%d\n", lb);
}
int main()
{
while (scanf("%d", &N) == 1) {
for (int i = 0; i < N; ++i) scanf("%d", X + i);
solve();
}
return 0;
}
POJ 3685
题意:边为n的方阵中,aij=i^2+100000i+j^2-100000j+i*j,求矩阵的第k大数。
思路:需要注意数据规模,特别是1≤M≤N×N,需要64位变量来存
首先来分析下这个函数f(i,j)

可知f(i,j)按行递增(同列),而按列不单调(同行)。
设C(x)表示矩阵中<x的元素有多少个。 所以可以一列一列来求有多少个比x小。然后二分求出正好有M−1个数比x小即可。
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll MAX = 1e15;
ll T;
ll N, M;
ll f(ll i, ll j) {
return i*i + 100000 * (i - j) + i*j + j*j;
}
bool C(ll x) { // 验证x是否过小。。。。这里写成int x调了好久= =
ll cnt = 0; // cnt 为<x的个数
for (int j = 1; j <= N; ++j) {
int lb = 0, ub = N + 1; // (lb, ub)
while (ub - lb > 1) {
int mid = (lb + ub) >> 1;
if (f(mid, j) < x) lb = mid; // 半闭半开区间[lb, ub)
else ub = mid;
}
cnt += lb;
}
return cnt < M;
}
void solve() {
ll lb = f(0, N), ub = f(N, 0) + 1;
while (ub - lb > 1) {
ll mid = (ub + lb) >> 1;
if (C(mid)) lb = mid; // 半闭半开区间[lb, ub)
else ub = mid;
}
cout << lb << endl;
}
int main() {
cin >> T;
while (T--) {
cin >> N >> M;
solve();
}
return 0;
}
POJ 3579 3685(二分-查找第k大的值)的更多相关文章
- 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_3579_Median_(二分,查找第k大的值)
描述 http://poj.org/problem?id=3579 给你一串数,共C(n,2)个差值(绝对值),求差值从大到小排序的中值,偶数向下取. Median Time Limit: 1000M ...
- poj 2579 中位数问题 查找第K大的值
题意:对列数X计算∣Xi – Xj∣组成新数列的中位数. 思路:双重二分搜索 对x排序 如果某数大于 mid+xi 说明在mid后面,这些数的个数小于 n/2 的话说明这个中位数 mid 太大 反之太 ...
- 查找第K大的值
这种题一般是给定N个数,然后N个数之间通过某种计算得到了新的数列,求这新的数列的第K大的值 POJ3579 题意: 用$N$个数的序列$x[i]$,生成一个新序列$b$. 新的序列定义为:对于任意的$ ...
- poj 3685 Matrix(二分搜索之查找第k大的值)
Description Given a N × N matrix A, whose element × i + j2 - × j + i × j, you are to find the M-th s ...
- poj 3579 Median (二分搜索之查找第k大的值)
Description Given N numbers, X1, X2, ... , XN, let us calculate the difference of every pair of numb ...
- hihoCoder 1133 二分·二分查找之k小数(TOP K算法)
#1133 : 二分·二分查找之k小数 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回里我们知道Nettle在玩<艦これ>,Nettle的镇守府有很 ...
- 基于快速排序思想partition查找第K大的数或者第K小的数。
快速排序 下面是之前实现过的快速排序的代码. function quickSort(a,left,right){ if(left==right)return; let key=partition(a, ...
- hiho week 37 P1 : 二分·二分查找之k小数
P1 : 二分·二分查找之k小数 Time Limit:10000ms Case Time Limit:1000ms Memory Limit:256MB 描述 在上一回里我们知道Nettle在玩&l ...
随机推荐
- GC.SuppressFinalize()的正确用法
SuppressFinalize函数是: 该方法在对象头中设置一个位,系统在调用终结器时将检查这个位.obj 参数应为此方法的调用方. 实现 IDisposable 接口的对象可以从 IDisposa ...
- 一个奇怪的SystemClock_Config问题解决方法
一直在SystemClock_Config程序死掉,然后下载最新的STm32Cube从新创建项目成功了.
- Netty入门(2) - 核心概念
Netty Crash Course 一个Netty程序一般开始于Bootstrap类,通过设置程序后,使用Handlers来处理特定的event和设置Netty中的事件,从而处理多个协议数据,比如实 ...
- 有关ACM学习的博客链接
大综合: 杭电OJ水题大全题解:http://blog.csdn.net/ysc504?viewmode=contents 14级浙江财经大学大佬:http://blog.csdn.net/jtjy5 ...
- POJ1251 Jungle Roads【最小生成树】
题意: 首先给你一个图,需要你求出最小生成树,首先输入n个节点,用大写字母表示各节点,接着说有几个点和它相连,然后给出节点与节点之间的权值.拿第二个样例举例:比如有3个节点,然后接下来有3-1行表示了 ...
- 【文件】java生成PDF文件
package test; import java.awt.Color; import java.io.FileOutputStream; import org.junit.Test; import ...
- 【API】API函数创建用户,添加到管理组
1 学习目标 使用API添加用户可以绕过某些杀毒软件的限制. 2 编程思路 2.1 代码原理 使用NetUserAdd这个API添加普通权限的用户,NetLocalGroupAddMembers这个A ...
- ReLu、LeakyRelu、PReLu(转载)
转载链接:http://blog.csdn.net/cham_3/article/details/56049205
- UML和模式应用5:细化阶段(2)--细化阶段制品之领域模型
1.前言 领域模型是OO分析中最重要和经典的模型.它阐述了领域中的重要概念: 领域模型作为设计某些软件对象的重要来源,也作为案例研究中探讨的几个制品的输入: 领域模型的范围限定于当前迭代开发的用例场景 ...
- vmware添加磁盘后linux无需重启识别的方法
cd /sys/class/scsi_host/ [root@centos4 scsi_host]# ls host0 host1 host2 有几个host就刷几次 [root@centos4 sc ...