Algoogle

Algorithm for Programming Contest

PKU 3579 Median

Category: PKU Tag: binary-search

Median

問題概要


解法


中央値を探索する.
Xをソートすればi番目との差がn以上になる数は
X[i] + n以上になる数, つまりX[i] + nを更に二分探索してやって
全体の要素数からその位置を引いてやった数になる.

コード


(3579.cpp) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <algorithm>
#include <iostream>
#include <vector>

#define repit(i,a) for(__typeof((a).begin()) i = (a).begin(); i != (a).end(); i++)
#define all(u) (u).begin(),(u).end()

using namespace std;

typedef long long ll;
typedef vector<int> vi;

int N;
vi X;
ll m;

bool ok(int n){
    ll cnt = 0;
    repit(itr,X)
        cnt += (ll)(X.end() - lower_bound(itr+1, X.end(), n + *itr));
    return cnt <= m / 2;
}

int main(){
    while(~scanf("%d", &N)){
        X.resize(N);
        m = N * (N - 1) / 2;
        repit(itr,X) scanf("%d", &*itr);
        sort(all(X));
        int lb = 0, ub = 1000000001;
        while(lb + 1 < ub){
            int mid = (lb + ub) / 2;
            if(ok(mid)) ub = mid;
            else lb = mid;
        }
        cout << ub - 1 << endl;
    }
    return 0;
}

Comments