有序数组维护一个序列
a
1
,
a
2
,
.
.
.
,
a
n
a_1,a_2,...,a_n
a1,a2,...,an,使得其保持有序,而且支持插入时间为
O
(
l
o
g
n
)
O(logn)
O(logn)的操作。python中有第三方库SortedList,C++并没有这样的stl库。
但我们可以使用vector和lower_bound进行类似的操作:使用lower_bound找到插入的位置,使用vector::insert插入该位置。
如题 洛谷P1168 中位数
正统的做法是维护一个最大堆和一个最小堆,最小堆的数在后半部分(比最大堆大),最大堆的数在前半部分,每次取最大堆的堆顶。但是写起来比较麻烦。
用有序数组可以这么写:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <cstring>
#include <climits>
#include <cstdlib>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <unordered_map>
#include <algorithm>
#define LT(x) (x * 2)
#define RT(x) (x * 2 + 1)
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
int n;
int a[100002];
vi b; // 有序数组
int main() {
//freopen("in.txt", "r", stdin);
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
int m = (n + 1) / 2;
b.push_back(a[0]);
printf("%d\n", a[0]);
for (int i = 1; i < m; ++i) {
int pos = lower_bound(b.begin(), b.end(), a[i * 2 - 1]) - b.begin();
b.insert(b.begin() + pos, a[i * 2 - 1]);
pos = lower_bound(b.begin(), b.end(), a[i * 2]) - b.begin();
b.insert(b.begin() + pos, a[i * 2]);
printf("%d\n", b[i]);
}
return 0;
}