[一道在别人课件上看到的没有出处的题]

题目大意:给定两个长度为n的有序数列,m次询问,问将序列合在一起排序后第k大是多少
\(N<=1e7\),\(m<=1e6\)
强制在线,且内存限制\(100Mb\)
\(100MB\)意味着我们只能开\(2\)\(1e7\)的数组。
这样的话我们可以选择用二路归并来做
时间复杂度\(O(n)\)
代码如下

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=1000005;
int a[N<<1],n;
int main() {
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i+n]);
	for(int i=1,x,j=n+1,tp=1;tp<=n;tp++) {
		scanf("%d",&x);
		while(a[j]<x&&j<=n+n) a[i++]=a[j++];
		a[i]=x;
		i++;
	}
        int m,x;    
        cin>>m;
        while(m--) {
                scanf("%d",&x);
                printf("%d\n",a[x]);
        }
	return 0;
}

然而正解给的是二分,时间复杂度\(O(mlogn)\),在极限数据下不如二路归并优秀。

posted @ 2018-10-22 16:09  SWHsz  阅读(127)  评论(0编辑  收藏  举报