题目大意:给定两个长度为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
",a[x]);
}
return 0;
}
然而正解给的是二分,时间复杂度(O(mlogn)),在极限数据下不如二路归并优秀。