题意:给出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;
}