//O(nlgn)找sorted的X[1..n]和Y[1..n]的共2n个数的中位数
//先排序,再找第n大的数(下中位数)
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int M=5000000;
struct FOO{
int num;
int status;
}A[M*2+5];
bool cmp(const FOO& a,const FOO& b)
{
return a.num<b.num;
}
void TWO_ARRAY_MEDIAN(FOO A[],int n)
{
sort(A+1,A+2*n+1,cmp);//对合并数组排序
if(A[n].status<=n)//第n大的数就是了
printf("在X中,下标%d,值%d\n",A[n].status,A[n].num);
else
printf("在Y中,下标%d,值%d\n",A[n].status-n,A[n].num);
}
int main(void)
{
freopen("1.txt","r",stdin);
int n,i;
scanf("%d",&n);
//第1到n个数是属于X的,第n+1到2n是属于Y的
for(i=1;i<=n+n;i++)//先将X和Y合并为一个数组,且要记住该元素在X还是在Y中
scanf("%d",&A[i].num),A[i].status=i;
TWO_ARRAY_MEDIAN(A,n);
return 0;
}
//O(lgn)找sorted的X[1..n]和Y[1..n]的共2n个数的中位数
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int M=5000000;
int X[M+5],Y[M+5];
int FIND_MEDIAN(int A[],int B[],int n,int low,int high)
{
while(1){
if(low>high) return 0;//找不到
int mid=(low+high)/2;
if(mid<n&&B[n-mid]<=A[mid]&&A[mid]<=B[n-mid+1])
return mid;
if(mid==n&&A[n]<=B[1])
return mid;
if(A[mid]>B[n-mid+1]) high=mid-1;
else low=mid+1;
}
}
void TWO_ARRAY_MEDIAN(int X[],int Y[],int n)
{
int median_index=FIND_MEDIAN(X,Y,n,1,n);
if(median_index)
printf("在X中,下标%d,值%d\n",median_index,X[median_index]);
else{//在X中找不到,所以就是在Y中
median_index=FIND_MEDIAN(Y,X,n,1,n);
printf("在Y中,下标%d,值%d\n",median_index,Y[median_index]);
}
}
int main(void)
{
freopen("1.txt","r",stdin);
int n,i;
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d",X+i);
for(i=1;i<=n;i++) scanf("%d",Y+i);
TWO_ARRAY_MEDIAN(X,Y,n);
return 0;
}