事情是这样的,我写了如下代码,使用来排序的,具体使用线段树维护最大值然后取出,具体见代码,模板题已过,用时比快排略慢,求hack:
#include<iostream>
using namespace std;
const int MAXN = 2e6;
int w[4 * MAXN], a[MAXN], s[MAXN], cnt,mu[4*MAXN];
bool vis[4 * MAXN];
int max(int a,int b) {
return a >= b ? a : b;
}
void build(int l, int r, int u) {
if (l == r) {
w[u] = a[l];
mu[u] = l;
return;
}
int M = (l + r) / 2;
build(l, M, 2 * u);
build(M + 1, r, 2 * u + 1);
w[u] = max(w[2 * u], w[2 * u + 1]);
if (w[u] == w[2 * u])mu[u] = mu[2 * u];
else mu[u] = mu[2 * u + 1];
}
void dlt(int l, int r, int u, int n) {
if (l == r) {
vis[u] = 1;
return;
}
int M = (l + r) / 2;
if (mu[u]<=M)dlt(l, M, 2 * u, n);
else dlt(M + 1, r, 2 * u + 1, n);
if (vis[2 * u] && vis[2 * u + 1])vis[u] = 1;
else if (vis[2 * u])w[u] = w[2 * u + 1], mu[u] = mu[2 * u + 1];
else if (vis[2 * u + 1])w[u] = w[2 * u], mu[u] = mu[2 * u];
else {
w[u] = max(w[2 * u], w[2 * u + 1]);
if (w[u] == w[2 * u])mu[u] = mu[2 * u];
else mu[u] = mu[2 * u + 1];
}
}
int main() {
int n; cin >> n;
for (int i = 1; i <= n; i++)cin >> a[i];
build(1, n, 1);
for (int i = 1; i <= n; i++) {
s[++cnt] = w[1];
dlt(1, n, 1, w[1]);
}
for (int i = n; i >= 1; i--) {
cout << s[i] << " ";
}
return 0;
}