求大佬来看一看
  • 板块灌水区
  • 楼主Butterfly___qwq
  • 当前回复14
  • 已保存回复14
  • 发布时间2023/5/14 21:54
  • 上次更新2023/10/23 15:42:33
查看原帖
求大佬来看一看
529458
Butterfly___qwq楼主2023/5/14 21:54

事情是这样的,我写了如下代码,使用来排序的,具体使用线段树维护最大值然后取出,具体见代码,模板题已过,用时比快排略慢,求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;
}
2023/5/14 21:54
加载中...