输出的答案,是随机的。
玩得先进风格变得非常随意!
//世界没有涟纯根本转不了!!!
#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;
}