用自己的暴力拍了几百组数据,用题解拍了一万组,然而找不到错的。。。
救救蒟蒻吧
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <ctime>
using namespace std;
inline int read() {
int w = 1, s = 0; char c;
while(!isdigit(c = getchar())) if(c == '-') w = -1;
while(isdigit(c)) s = (s << 1) + (s << 3) + (c & 15), c = getchar();
return s * w;
}
const int N = 1e6 + 5;
struct Node { int l, r, siz, rand, rev, v, mn; } tr[N];
int siz, rt, x, y, z;
inline int insert(int v) {
tr[++ siz].siz = 1;
tr[siz].v = tr[siz].mn = v;
tr[siz].rand = rand();
tr[siz].rev = 0;
return siz;
}
inline void push_up(int x) {
tr[x].siz = tr[tr[x].l].siz + tr[tr[x].r].siz + 1;
tr[x].mn = tr[x].v;
if(tr[x].l) tr[x].mn = min(tr[x].mn, tr[tr[x].l].mn);
if(tr[x].r) tr[x].mn = min(tr[x].mn, tr[tr[x].r].mn);
}
inline void reverse(int x) {
if(tr[x].rev) {
swap(tr[x].l, tr[x].r);
if(tr[x].l) tr[tr[x].l].rev ^= 1;
if(tr[x].r) tr[tr[x].r].rev ^= 1;
tr[x].rev = 0;
}
}
inline void split(int now, int k, int &x, int &y) {
if(!now) x = y = 0;
else {
reverse(now);
if(tr[tr[now].l].siz < k) x = now, split(tr[x].r, k - tr[tr[x].l].siz - 1, tr[x].r, y);
else y = now, split(tr[y].l, k, x, tr[y].l);
push_up(now);
}
}
inline int merge(int x, int y) {
if(!x || !y) return x | y;
if(tr[x].rand < tr[y].rand) {
reverse(x);
tr[x].r = merge(tr[x].r, y);
push_up(x); return x;
} else {
reverse(y);
tr[y].l = merge(x, tr[y].l);
push_up(y); return y;
}
}
inline int getrk(int x) {
int k = 1;
while(1) {
reverse(x);
if(tr[x].l && tr[x].mn == tr[tr[x].l].mn) x = tr[x].l;
else if(tr[x].r && tr[x].mn == tr[tr[x].r].mn) k += tr[tr[x].l].siz + 1, x = tr[x].r;
else return k + tr[tr[x].l].siz;
}
}
int n, val[N];
struct node { int v, id; } a[N];
inline bool cmp(node a, node b) {
return a.v < b.v;
}
int main() {
srand(time(NULL));
scanf("%d", &n);
for(int i = 1; i <= n; i ++ ) scanf("%d", &a[i].v), a[i].id = i;
sort(a + 1, a + n + 1, cmp);
for(int i = 1; i <= n; i ++ ) val[a[i].id] = i;
for(int i = 1; i <= n; i ++ ) rt = merge(rt, insert(val[i]));
for(int i = 1; i <= n; i ++ ) {
int k = getrk(rt);
split(rt, k, rt, x);
split(rt, k - 1, rt, y);
tr[rt].rev ^= 1;
rt = merge(rt, x);
printf("%d ", k + i - 1);
}
}