已知两个已经排好序(非减序)的序列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;
}