POJ 3579 Median(二分答案)
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 11599 | Accepted: 4112 |
Description
Note in this problem, the median is defined as the (m/2)-th smallest number if m,the amount of the differences, is even. For example, you have to find the third smallest one in the case of m = 6.
Input
In each test case, N will be given in the first line. Then N numbers
are given, representing X1, X2, ... , XN,
( Xi ≤ 1,000,000,000 3 ≤ N ≤ 1,00,000 )
Output
Sample Input
4
1 3 2 4
3
1 10 2
Sample Output
1
8
Source
【题意】
给你n个数,然后求它们两两相减的绝对值,然后找出这些绝对值的中位数
【分析】
1、先对n个数排序,那么最后的结果ans一定满足0<=ans<an-a1
2、我们用二分进行逼近。l=0,r=an-a1,mid=(l+r)/2;
3、很明显是原数组两个数相减的绝对值<mid个数,和>mid的个数进行比较。(绝对值的个数<mid,ans在[mid,r]区间,否则在[l,mid]区间内)
4、以求一个数减去a[1]的值小于mid的个数为例,我们找到一个a[i]>=a[1]+mid时最小的一个i,那么数组[1,i)值减去a[1],都小于mid,这样枚举i就可以求得两数相减差值(的绝对值)小于mid的个数。
【代码】
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
inline int read(){
register char ch=getchar();register int x=0;
for(;ch<'0'||ch>'9';ch=getchar());
for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
return x;
}
const int N=2e5+5;
int n,a[N];ll m;
inline bool check(int now){
ll sum=0;
for(int i=1;i<=n;i++)
sum+=lower_bound(a+i+1,a+n+1,a[i]+now)-(a+i)-1;
return m&1?sum<=m/2:sum<m/2;
}
int main(){
while(scanf("%d",&n)==1){
for(int i=1;i<=n;i++) a[i]=read();
sort(a+1,a+n+1);m=1LL*n*(n-1)>>1;
int l=0,r=a[n]-a[1],mid,ans=0;
while(l<=r){
mid=l+r>>1;
if(check(mid)){
ans=mid;
l=mid+1;
}
else{
r=mid-1;
}
}
printf("%d\n",ans);
}
return 0;
}
POJ 3579 Median(二分答案)的更多相关文章
- POJ 3579 Median 二分加判断
Median Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12453 Accepted: 4357 Descripti ...
- POJ 3579 Median (二分)
...
- poj 3579 Median 二分套二分 或 二分加尺取
Median Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5118 Accepted: 1641 Descriptio ...
- POJ 3579 Median(二分答案+Two pointers)
[题目链接] http://poj.org/problem?id=3579 [题目大意] 给出一个数列,求两两差值绝对值的中位数. [题解] 因为如果直接计算中位数的话,数量过于庞大,难以有效计算, ...
- POJ 3579 Median 【二分答案】
<题目链接> 题目大意: 给出 N个数,对于存有每两个数的差值的序列求中位数,如果这个序列长度为偶数个元素,就取中间偏小的作为中位数. 解题分析: 由于本题n达到了1e5,所以将这些数之间 ...
- POJ 3104 Drying(二分答案)
题目链接:http://poj.org/problem?id=3104 ...
- POJ 3122 Pie 二分答案
题意:给你n个派,每个派都是高为一的圆柱体,把它等分成f份,每份的最大体积是多少. 思路: 明显的二分答案题-- 注意π的取值- 3.14159265359 这样才能AC,,, //By Sirius ...
- poj 3579 Median (二分搜索之查找第k大的值)
Description Given N numbers, X1, X2, ... , XN, let us calculate the difference of every pair of numb ...
- POJ 3579 median 二分搜索,中位数 难度:3
Median Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3866 Accepted: 1130 Descriptio ...
随机推荐
- 纯js实现最简单的文件上传(后台使用MultipartFile)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- asp.net导出excel 问题及服务器的部署dcom组件配置
一.服务器上没有装office 如果要用MS的,这个问题基本不用考虑,只有安装才能解决,没有其它办法! (即使有牛人弄出来 了,估计也是给自己找麻烦) 不过,我只在服务器上装了一个2003精简版, 我 ...
- textarea标签内容为(英文或数字不自动换行)的解决方法
textarea 显示一串英文时不会发生换行. 以下是两种解决方法:1.限制textarea的大小 width 设置为 00px (不要设置为00%)cols 设置为 30+ (也有类似效果) 2. ...
- UNIX环境编程学习笔记(15)——进程管理之进程终止
lienhua342014-10-02 1 进程的终止方式 进程的终止方式有 8 种,其中 5 种为正常终止,它们是 1. 从 main 返回. 2. 调用 exit. 3. 调用_exit 或_Ex ...
- Win7 共享打印机 “错误:共享无法保存设置”
原因:windows的后台防火墙服务进程[Windows Firewall{服务描述}.MpsSvc{服务名字}] 关闭了.services.smc 关闭 解决:重启服务 关闭防火墙的功能,通过控制面 ...
- qt creator如何实现转到槽功能
ui_mainwindow.h .
- 如何在Linux系统中安装VMware
首先打开vmware官网的下载链接:https://my.vmware.com/web/vmware/info/slug/desktop_end_user_computing/vmware_works ...
- mysql执行SQL语句时报错:[Err] 3 - Error writing file '/tmp/MYP0G1B8' (Errcode: 28 - No space left on device)
问题描述: 今天一同事在mysql中执行SQL语句的时候,报了/tmp空间不足的问题,报错如下: [SQL] SELECT f.prov as 字段1, MAX( CASE f.flag_name W ...
- scrapy 元素的相对xpath
- python--内置函数---13
原创博文,转载请标明出处--周学伟 http://www.cnblogs.com/zxouxuewei/ Python 内置函数 内置函数 abs() divmod() input() ...