题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=3149
分治法求两个等长有序数组的中位数。
使用分治法复杂度可以从O(n)降到O(logn)。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <map>
#include <queue>
#include <algorithm>
using namespace std;
#define Maxn 300005
int median(int *a,int *b,int length)
{
if(length == 1) return a[0] < b[0] ? a[0] : b[0];
int mid = (length - 1)/2;
if(a[mid] == b[mid]) return a[mid];
if(a[mid] < b[mid])
{
return median(&a[length - mid -1],b,mid+1);
}
else
{
return median(a,&b[length - mid -1],mid+1);
}
}
int a[Maxn],b[Maxn];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int t;
int n;
int A,B,C,D;
int q;
int len;
scanf(" %d",&t);
while(t--)
{
scanf(" %d",&n);
for(int i=0; i<n; i++) scanf(" %d",&a[i]);
for(int i=0; i<n; i++) scanf(" %d",&b[i]);
scanf(" %d",&q);
for(int i=0; i<q; i++)
{
scanf(" %d %d %d %d",&A,&B,&C,&D);
len = B-A+1;
int ans = median(a+A,b+C,len);
printf("%d\n",ans);
}
}
return 0;
}