已知兩個已經排好序(非減序)的序列X和Y,其中X的長度爲m,Y長度爲n,算法
如今請你用分治算法,找出X和Y的第k小的數,算法時間複雜度爲O(max{logm, logn})。ide
輸入格式spa
第一行有三個數,分別是長度m、長度n和k,中間空格相連(1<=m,n<=100000; 1<=k<=m+n)。it
第二行m個數分別是非減序的序列X。第三行n個數分別是非減序的序列Y。class
輸出格式tab
序列X和Y的第k小的數。di
#define N 100010時間
using namespace std;view
int a[N];vi
int b[N];
int n,m,k;
int main()
{
int la,lb,ra,rb,ma,mb;
int k,t;
//freopen("in.txt","r",stdin);
scanf("%d%d%d",&n,&m,&k);
int i;
for( i=1;i<=n;i++) scanf("%d",&a[i]);
for( i=1;i<=m;i++) scanf("%d",&b[i]);
la = lb = 1;
ra = n;
rb = m;
while(la<=ra && lb<=rb)
{
ma = (la+ra)/2;
mb = (lb+rb)/2;
t = ma+mb-la-lb+2;
if(b[mb]>a[ma])
{
if(t>k) rb = mb-1;
else
{
k =k-(ma-la+1);
la = ma+1;
}
}
else
{
if(t>k) ra = ma -1;
else
{
k=k- (mb-lb+1);
lb = mb+1;
}
}
}
if(la>ra) printf("%d\n",b[lb+k-1]);
else printf("%d\n",a[la+k-1]);
return 0;
}