兩個有序數序列中找第k小

已知兩個已經排好序(非減序)的序列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;

}

相關文章
相關標籤/搜索