萌新求助
查看原帖
萌新求助
173660
zhoukangyang楼主2020/6/25 11:14
#include<bits/stdc++.h>
#define N 110000
using namespace std;
int n,root;
struct node{
	int key,siz,val,minn,lazy,son[2];
} q[N];
int new_root(int id,int val) {
	q[id].key = rand() , q[id].siz = 1 , q[id].minn = q[id].val = val;
	return id;
}
void upd(int now) {
	q[now].minn = min(q[now].val,min(q[q[now].son[0]].minn,q[q[now].son[1]].minn));
	q[now].siz = q[q[now].son[0]].siz+q[q[now].son[1]].siz+1; 
}
void flip(int now) {
	q[now].lazy^=1;
	swap(q[now].son[0],q[now].son[1]);
}
void pushdown(int now) {
	if(!q[now].lazy) return;
	if(q[now].son[0]) flip(q[now].son[0]);
	if(q[now].son[1]) flip(q[now].son[1]);
	q[now].lazy = 0;  
}
void split(int now,int &x,int &y){
	if(!now) x=y=0;
	else {
		pushdown(now);
		if(q[now].minn == q[q[now].son[0]].minn) 
			y=now,split(q[now].son[0],x,q[y].son[0]);
		else 
			x=now,split(q[now].son[1],q[x].son[1],y);
		upd(now);
	}
}
int merge(int x,int y) {
	if(!x||!y) return x+y;
	else {
		if(q[x].key>q[y].key) {
			pushdown(x),q[x].son[1]=merge(q[x].son[1],y),upd(x);
			return x;
		}
		else {
			pushdown(y),q[y].son[0]=merge(x,q[y].son[0]),upd(y);
			return y;
		}
	}
}
int main() {
	int x;
	srand('F'+'R'+'O'+'G'+'G'+'Y'+'A'+'K'+'I'+'O'+'I');
	q[0].minn=1e9;
	scanf("%d",&n);
	for(int i = 1; i <= n; i++) {
		scanf("%d",&x);
		root=merge(root,new_root(i,x));
	}
	for(int i = 1; i <= n; i++) {
		int splx,sply,splz;
		split(root,splx,sply);
		printf("%d ",q[splx].siz+i-1);
		flip(splx);
		split(splx,splz,splx);
		root=merge(splx,sply);
	}
	return 0;
} 
2020/6/25 11:14
加载中...