萌新求助fhq Treap写法过不了样例
查看原帖
萌新求助fhq Treap写法过不了样例
483928
Z1qqurat楼主2023/7/20 21:13

输出的答案,是随机的。

玩得先进风格变得非常随意!

//世界没有涟纯根本转不了!!!
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <vector>
#include <map>
#include <ctime>
#define ll long long
#define pii pair<int, int>
#define mr make_pair
using namespace std;
const int N = 1e5 + 5;
int n, m, root, tot, a[N], b[N];
struct node{
    int siz, val, tag, fa, ls, rs, rk, minn;
}tr[N];

int new_node(int vl) {
    tr[++tot].val = vl, tr[tot].minn = vl, tr[tot].siz = 1, tr[tot].rk = rand();
    tr[tot].fa = tr[tot].ls = tr[tot].rs = tr[tot].tag = 0;
    return tot;
}

void pushup(int k) {
    tr[k].siz = tr[tr[k].ls].siz + tr[tr[k].ls].siz + 1;
    tr[k].minn = tr[k].val;
    if(tr[k].ls) tr[k].minn = min(tr[k].minn, tr[tr[k].ls].minn);
    if(tr[k].rs) tr[k].minn = min(tr[k].minn, tr[tr[k].rs].minn);
    return ;
}

void pushdown(int k) {
    if(!tr[k].tag) return ;
    swap(tr[k].ls, tr[k].rs);
    if(tr[k].ls) tr[tr[k].ls].tag ^= 1;
    if(tr[k].rs) tr[tr[k].rs].tag ^= 1;
    tr[k].tag = 0;
    return ;
}

void split(int k, int &a, int &b, int num) {
    if(!k) {
        a = b = 0; return ;
    }
    pushdown(k);
    if(tr[tr[k].ls].siz + 1 > num) {
        b = k;
        split(tr[k].ls, a, tr[k].ls, num);
    }
    else {
        a = k;
        split(tr[k].rs, tr[k].rs, b, num - tr[tr[k].ls].siz - 1);
    }
    pushup(k); return ;
}

void merge(int &k, int a, int b) {
    if(!a || !b) {
        k = a + b; return ;
    }
    if(tr[a].rk < tr[b].rk) {
        k = a; pushdown(a);
        merge(tr[a].rs, tr[a].rs, b);
    }
    else {
        k = b; pushdown(b);
        merge(tr[b].ls, a, tr[b].ls);
    }
    pushup(k); return ;
}

void insert(int &k, int vl) {
    merge(k, k, new_node(vl));
    return ;
}

int find_id(int k) {
    int ret = 1;
    while(1) {
        pushdown(k);
        if(tr[k].ls && tr[tr[k].ls].minn == tr[k].minn) {
            k = tr[k].ls;
        }
        else if(tr[k].rs && tr[tr[k].rs].minn == tr[k].minn) {
            ret += tr[tr[k].ls].siz + 1, k = tr[k].rs;
        }
        else return ret + tr[tr[k].ls].siz;
    }
}

int main() {
    srand(time(0));
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
    memcpy(b, a, sizeof(a));
    stable_sort(b + 1, b + n + 1);
    for (int i = 1; i <= n; ++i) {
        a[i] = lower_bound(b + 1, b + n + 1, a[i]) - b;
    }
    for (int i = 1; i <= n; ++i) {
        insert(root, a[i]);
    }
    for (int i = 1; i <= n; ++i) {
        int num = find_id(root), x = 0, y = 0, z = 0;
        split(root, x, y, num);
        split(x, x, z, num - 1);
        tr[x].tag ^= 1;
        merge(root, x, y);
        printf("%d ", num + i - 1);
    }
    return 0;
}
2023/7/20 21:13
加载中...