题意:给n个数,求出C(n,2)个|Ci-Cj|数中的的中位数。
解法:二分枚举结果。总复杂度NlogM,M为数的大小范围。
代码:
/****************************************************
* author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <string.h>
using namespace std;
#define eps 1e-8
typedef long long LL;
int n;
int num[100010];
bool OK(int middle)
{
LL ans=0;
for(int i=0;i<n;i++)
ans+=max(0,num+n-lower_bound(num,num+n,num[i]+middle));
return ans>LL(n)*LL(n-1)/2-(LL(n)*LL(n-1)/2+1)/2;
}
int main()
{
while(scanf("%d",&n)==1)
{
for(int i=0;i<n;i++)
scanf("%d",num+i);
sort(num,num+n);
int left=0;int right=num[n-1]-num[0];
//cout<<OK(2)<<endl;
while(left<=right)
{
int middle=(left+right)/2;
if(OK(middle))
left=middle+1;
else
right=middle-1;
}
cout<<left-1<<'\n';
}
return 0;
}