P3165 排序机械臂 求调
  • 板块学术版
  • 楼主Imaginative
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/6/1 13:10
  • 上次更新2024/6/1 15:13:34
查看原帖
P3165 排序机械臂 求调
761684
Imaginative楼主2024/6/1 13:10
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,m;
int root,ll,rr,zz;
struct node{
	int val,id;
	friend bool operator<(node x,node y){
		if(x.val==y.val) return x.id<y.id;
		else return x.val<y.val;
	}
}a[N];
struct treap{
	int lson,rson;
	int val,pri,siz;
	int tag,mn;
}op[N];
int cnt;
int build(int x){
	op[++cnt].val=x;
	op[cnt].pri=rand();
	op[cnt].siz=1;
	op[cnt].mn=x;
	return cnt;
}
void push_up(int num){
	op[num].siz=op[op[num].lson].siz+op[op[num].rson].siz+1;
	op[num].mn=op[num].val;
	if(op[num].lson) op[num].mn=min(op[num].val,op[op[num].lson].mn);
	if(op[num].rson) op[num].mn=min(op[num].val,op[op[num].rson].mn);
}
void push_down(int num){
	if(op[num].tag){
		swap(op[num].lson,op[num].rson);
		if(op[num].lson) op[op[num].lson].tag^=1;
		if(op[num].rson) op[op[num].rson].tag^=1;
		op[num].tag=0;
	}
}
void split(int num,int x,int &l,int &r){
	if(!num){
		l=r=0;
		return;
	}
	push_down(num);
	if(op[op[num].lson].siz<x){
		x=x-op[op[num].lson].siz-1;
		l=num;
		split(op[l].rson,x,op[l].rson,r);
	}
	else{
		r=num;
		split(op[r].lson,x,l,op[r].lson);
	}
	push_up(num);
}
int merge(int l,int r){
	if(!l||!r){
		return l+r;
	}
	if(op[l].pri<op[r].pri){
		push_down(l);
		op[l].rson=merge(op[l].rson,r);
		push_up(l);
		return l; 
	}
	else{
		push_down(r);
		op[r].lson=merge(l,op[r].lson);
		push_up(r);
		return r;
	}
}
int sv[N];
int get_rk(int x){
	int res=1;
	while(1){
		push_down(x);
		if(op[x].lson&&op[x].mn==op[op[x].lson].mn){
			x=op[x].lson;
		}
		else if(op[x].rson&&op[x].mn==op[op[x].rson].mn){
			res+=op[op[x].lson].siz+1;
			x=op[x].rson;
		}
		else return res+op[op[x].lson].siz;
	}
}
void output(int x){
	if(!x) return;
	push_down(x);
	output(op[x].lson);
	cout<<op[x].val<<" ";
	output(op[x].rson); 
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i].val;
		a[i].id=i;
	}
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++){
		sv[a[i].id]=i;
	}
	for(int i=1;i<=n;i++){
		root=merge(root,build(sv[i]));
	}
	for(int i=1;i<=n;i++){
		int rk=get_rk(root);
		split(root,rk,ll,rr);
		split(ll,rk-1,ll,zz);
		op[ll].tag^=1;
		root=merge(ll,rr);
		cout<<i+rk-1<<" ";
	}
	return 0;
}

只能过样例

2024/6/1 13:10
加载中...