TAG
-
算法
?
【
S
T
L
?
优先队列、重载运算符】
算法 - 【STL - 优先队列、重载运算符】
算法?【STL?优先队列、重载运算符】时间复杂度
-
O
(
N
?
log
?
N
)
O(N \ast \log N)
O(N?logN)//
#include <bits/stdc++.h>
using namespace std;
// #define int long long
const int N = 2e5 + 6;
struct A {
int idx, w;
} in[N];
struct cmp0 {
bool operator()(const A& x, const A& y) const { return y.w < x.w; }
};
struct cmp1 {
bool operator()(const A& x, const A& y) const { return y.w > x.w; }
};
void solve() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
int ai;
scanf("%d", &ai);
in[i] = (A){i, ai};
}
priority_queue<A, vector<A>, cmp0> q0;
priority_queue<A, vector<A>, cmp1> q1;
for (int i = 1; i <= n; i++) q0.push(in[i]);
string s;
cin >> s;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '0') {
A tt = q0.top(); q0.pop();
printf("%d%c", tt.idx, " \n"[i == s.size() - 1]);
q1.push(tt);
} else if (s[i] == '1') {
A tt = q1.top(); q1.pop();
printf("%d%c", tt.idx, " \n"[i == s.size() - 1]);
}
}
}
signed main() {
int t = 1;
// scanf("%d", &t);
while (t--) solve();
return 0;
}
实现细节
参考示意图
参考链接
作者 | 乐意奥AI