アイデア:
中央値の位置を計算し、2つの配列を比較して中央値を取得します。時間計算量はO(n + m)です。
1029中央値(25ポイント)
N個の整数のシーケンスSが増加すると、中央値は中央の位置の数値になります。たとえば、S1 = {11、12、13、14}の中央値は12であり、S2 = {9、10、15、16、17}の中央値は15です。2つのシーケンスの中央値は次のように定義されます。両方のシーケンスのすべての要素を含む非減少シーケンスの中央値。たとえば、S1とS2の中央値は13です。
整数の2つの増加するシーケンスが与えられると、それらの中央値を見つけるように求められます。
入力仕様:
各入力ファイルには、1つのテストケースが含まれています。各ケースは2行を占め、それぞれがシーケンスの情報を提供します。各シーケンスについて、最初の正の整数N(≤2×10 5)はそのシーケンスのサイズです。次に、スペースで区切られたN個の整数が続きます。すべての整数の範囲であることが保証されている long int型。
出力仕様:
テストケースごとに、指定された2つのシーケンスの中央値を1行で出力する必要があります。
サンプル入力:
4 11 12 13 14
5 9 10 15 16 17
サンプル出力:
13
例:
#include<iostream>
#include<vector>
using namespace std;
vector<long> *input(void)
{
int N;
cin >> N;
vector<long> *p = new vector<long>(N);
for(int i = 0; i < N; i++) cin >> (*p)[i];
return p;
}
int main()
{
vector<long> *L1 = input();
vector<long> *L2 = input();
int m, i, j, mean = ( L1->size() + L2->size()+1) / 2;
for(i = 0, j = 0; i < L1->size() && j < L2->size() && mean; mean--)
if((*L1)[i] <= (*L2)[j]) m = (*L1)[i++];
else m = (*L2)[j++];
if(mean)
if(i == L1->size()) m = (*L2)[j+mean-1];
else m = (*L1)[i+mean-1];
cout << m << endl;
}