poj3579 median 二分搜索 中位数

Median

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 3866   Accepted: 1130

Description

Given N numbers, X1X2, ... , XN, let us calculate the difference of every pair of numbers: ∣Xi - Xj∣ (1 ≤ i  j  N). We can get C(N,2) differences through this work, and now your task is to find the median of the differences as quickly as you can!

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 = 6.

Input

The input consists of several test cases.
In each test case, N will be given in the first line. Then N numbers are given, representing X1X2, ... , XN, ( X≤ 1,000,000,000  3 ≤ N ≤ 1,00,000 )

Output

For each test case, output the median in a separate line.

Sample Input

4
1 3 2 4
3
1 10 2

Sample Output

1
8思路: 一眼可知把原数列a排列一遍的时间还是有的,但是要想得到两两之差然后归并则T,M都超,计数范围也太大了,把a排序之后两两相减,得到相邻差数组b,那么b就可以构成所有需要的差了,那么现在假设有个差delta,使得a[i]+delta<=a[j],a[i]+delta>a[j-1],那么delta一定大于a[j-1]-a[i],a[j-2]-a[i]....delta一定小于等于a[j]-a[i],a[j+1]-a[i],使用low_bound可以在logn时间内求出j,nlogn时间就可以求出所有比delta大的差的个数,这时就可以判断是否delta算是差的中位数.那么直接二分差即可,总时间n*logn*logn,5*1e7-1e8的数量级,可以跑过
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1e5+5;
int a[maxn];
long long halfh,h;
int n;
bool judge(int mid){
    long long cnt=0;
    for(int i=0;i<n;i++){
        cnt+=a+n-lower_bound(a+i,a+n,a[i]+mid);
    }
    return cnt>halfh;
}
int main(){
    while(scanf("%d",&n)==1){
        h=n*(n-1)/2;halfh=h/2;
        for(int i=0;i<n;i++){scanf("%d",a+i);}
        sort(a,a+ n);
        int l=0,r=a[n-1],mid;
        while(r-l>1){
            mid=r+l>>1;
            if(judge(mid)){
                l=mid;
            }
            else r=mid;
        }
        printf("%d\n",l);
    }
}

  

 
时间: 2024-10-10 05:25:04

poj3579 median 二分搜索 中位数的相关文章

POJ3579 Median

Description Given N numbers, X1, X2, ... , XN, let us calculate the difference of every pair of numbers: ∣Xi - Xj∣ (1 ≤ i < j ≤ N). We can get C(N,2) differences through this work, and now your task is to find the median of the differences as quickly

HDU 3282 Running Median 动态中位数,可惜数据范围太小

Running Median Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=3282 Description For this problem, you will write a program that reads in a sequence of 32-bit signed integers. After each odd-indexed value is read

POJ3579 Median(二分答案 + O(N)判定)

传送门 大意:给出N个数,对于存有每两个数的差值的序列求中位数,如果这个序列有偶数个元素,就取中间偏小的作为中位数. 因为N<=100000,所以想要求出每一个差值是不可行的,我们很容易想到二分答案. 在二分答案时我们会进行判定,求出小于等于枚举值的个数,我看其他人的判定似乎都是O(NlogN) 的,我在这里就给出一个O(N)的判定方法. 首先同样将数组排序(我们命名为a数组好了) 我们枚举一个区间[l,r),因为当r增加的时候,要使[l,r)中的数都大于于等于a[r]?枚举值,l必定不会增加,

POJ3579 Median —— 二分

题目链接:http://poj.org/problem?id=3579 Median Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8286   Accepted: 2892 Description Given N numbers, X1, X2, ... , XN, let us calculate the difference of every pair of numbers: ∣Xi - Xj∣ (1 ≤ i < 

POJ 3784 Running Median (动态中位数)

题目链接:http://poj.org/problem?id=3784 题目大意:依次输入n个数,每当输入奇数个数的时候,求出当前序列的中位数(排好序的中位数). 此题可用各种方法求解. 排序二叉树方法,每个结点保存以其为根的左右子树中数的个数.如果数据出的够严格,这种方法会被卡的,除非是通过动态调整维持树的高度较小. 排序二叉树的代码如下: #include <cstdio> using namespace std; #define N 20000 struct Node { int v;

第三周 leetcode 4. Median of Two Sorted Arrays (HARD)

4. Median of Two Sorted Arrays 给定两个有序的整数序列.求中位数,要求复杂度为对数级别. 通常的思路,我们二分搜索中位数,对某个序列里的某个数 我们可以在对数时间内通过二分算法求得两个序列中比它小的数,整体复杂度也是对数级别.但是代码实现较为困难. 换一个思路,我们把中位数不要当作一个数,而当作一个序列的划分.划分后,序列的左半部设为L,右半部设为R 满足max(L)<=min(R)且满足len(L)==len(R) 二分搜索这个划分即可.对于A+B的长度为奇数的情

中位数定义及示例

def Median(t): """中位数""" arr = sorted(t) idx = (len(arr) - 1) / 2 if type(idx) is int: return arr[idx] if type(idx) is float: return Mean(arr[int(math.floor(idx)):int(math.ceil(idx)) + 1]) 中位数定义及示例

基本概念: 均值,期望,中位数,众数,极差,总体方差,样本方差,协方差

# --*-- coding:utf-8 --*-- import math import itertools def Mean(t): """均值""" return float(sum(t)) / len(t) def E(x, p): """ 离散性随即变量的数学期望(也称为均值): 随机变量X与其概率P乘积的和 """ return sum([x[i] * p[i] for i

使用Jmeter进行http接口做功能、性能测试

在测试移动APP时,会有很多接口需要做测试,我在这里介绍一下对HTTP接口做功能.性能的测试.首先我们会从开发人员拿到接口数据.     一.测试需求描述 1. 本次测试的接口为http服务端接口 2. 接口:查询功能接口 3.接口描述:用户对订单列表进行查询 IP:http://192.168.8.197/biz/api/v1/mobile/doctor/subscribe/orderList 请求方式:get 端口号:9090 请求头参数:token = ffb74003075c409485