#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int median(int *a, int a1, int a2, int *b, int b1, int b2) {
int m1 = (a1+a2) >> 1;
int m2 = (b1+b2) >> 1;
if(a[m1] > b[m2]) {
swap(a, b);
swap(a1, b1);
swap(a2, b2);
swap(m1, m2);
}
int left1 = m1 - a1;
int left2 = m2 - b1;
int right1 = a2 - m1;
int right2 = b2 - m2;
int m;
if(a[m1] == b[m2])
m = a[m1];
else {
int diff = (left1 < right2 ? left1 : right2);
if(diff) {
m = median(a, a1+diff, a2, b, b1, b2-diff);
} else if(!left1) {
if(right1) {
if(a[m1+1] >= b[m2])
m = b[m2];
else {
if(left2)
m = (b[m2-1] > a[m1+1] ? b[m2-1] : a[m1+1]);
else
m = a[m1+1];
}
}
else {
if(left2 < right2)
m = b[m2];
else {
if(left2)
m = (a[m1] > b[m2-1] ? a[m1] : b[m2-1]);
else
m = a[m1];
}
}
}
else if(!right2) {
if(left1 == right1)
m = a[m1];
else
m = (a[m1+1] < b[m2] ? a[m1+1] : b[m2]);
}
}
return m;
}
int main(int argc, char **argv) {
int n1, n2;
cin >> n1;
int *pa = new int[n1];
for(int i = 0; i < n1; i ++)
scanf("%d", pa+i);
cin >> n2;
int *pb = new int[n2];
for(int i = 0; i < n2; i ++)
scanf("%d", pb+i);
cout << median(pa, 0, n1-1, pb, 0, n2-1);
return 0;
}
1029. Median (25)
最新推荐文章于 2020-03-25 14:19:14 发布