[一道在别人课件上看到的没有出处的题]
题目大意:给定两个长度为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)\),在极限数据下不如二路归并优秀。
我是咸鱼。转载博客请征得博主同意Orz