poj3579

普通的n^2方法必定超时。
对a排序后,与a_i的差大于mid(也就是某个数大于a_i + mid)的那些数的个数如果小于N / 2的话,说明mid太大了。

//272k, 594ms
#include <iostream>
#include <algorithm>

using namespace std;

const int MAX_N = 100005;

int n, m;
int a[MAX_N];

bool C(int val) {
    int count = 0;
    for(int i=0; i<n; i++) {
        count += upper_bound(a+i, a+n, val+a[i]) - 1 - (a + i);
    }
    return count >= m;
} 

int main() {

    freopen("in.txt", "r", stdin);

    while(~scanf("%d", &n)) {
        for(int i=0; i<n; i++)  scanf("%d", &a[i]);

        sort(a, a+n);

        int c = n * (n - 1) / 2;
        if(c % 2 == 0)  m = c / 2;
        else            m = c / 2 + 1;

        int l = 0, r = a[n-1] - a[0];
        while(l < r) {
            int mid = l + (r - l) / 2;
            if(C(mid))
                r = mid ;
            else
                l = mid + 1;
        }

        printf("%d\n", r);
    }

    fclose(stdin);

    return 0;
}
posted @ 2016-12-30 14:35  StevenLuke  阅读(117)  评论(0编辑  收藏  举报