poj 3579 二分

来源:互联网 发布:大芒果论坛新域名 编辑:程序博客网 时间:2024/06/12 01:39

题意:给出N个数,对于存有每两个数的差值的序列求中位数,如果这个序列有偶数个元素,就取中间偏小的作为中位数。N<=100000


然后每次二分一个差值,进行判断

判断的时候每次o(n)遍历,总的复杂度nlogn

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define rep(i, j, k) for(int i = j; i <= k; i++)using namespace std;int n, a[100005];int main(){while (cin >> n)    {rep (i, 1, n)scanf ("%d", &a[i]);        sort(a + 1, a + n + 1);        int l = 0, r = a[n], m = (n-1)*n/4;        if((n * (n - 1) / 2) % 2) m ++;        while(l < r)        {            int mid = (l + r) >> 1;            int j = 1, num = 0;rep (i, 2, n)            {                while(a[i] - a[j] > mid)                    j ++;                num += (i-j);            }            if(num >= m)                r = mid;            else l = mid + 1;        }cout << l << endl;    }    return 0;}


0 0
原创粉丝点击