help
查看原帖
help
178519
tidongCrazy楼主2020/11/2 19:06

用自己的暴力拍了几百组数据,用题解拍了一万组,然而找不到错的。。。

救救蒟蒻吧

#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);
	}
}
2020/11/2 19:06
加载中...