社区讨论

求条,样例过不了

P3165[CQOI2014] 排序机械臂参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhjsn92q
此快照首次捕获于
2025/11/04 07:51
4 个月前
此快照最后确认于
2025/11/04 07:51
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
#define SB_Emplace 250
using namespace std;
int n,m,q;
mt19937 rnd(chrono::system_clock::now().time_since_epoch().count());
struct node{int ls,rs,key,pri,lazy,size;}t[1000005];
int cnt,root,a[10000005],id[10000005],fa[10000005];
inline int newNode(int x){ 
	t[++cnt].key=x;
	t[cnt].pri=rnd();
	t[cnt].size=1;
	id[x]=cnt;
	return cnt;
}
inline void Update(int u){
	t[u].size=t[t[u].ls].size+t[t[u].rs].size+1;
	fa[t[u].ls]=fa[t[u].rs]=u;
}
void push_down(int u){
    if(t[u].lazy){
        swap(t[u].ls,t[u].rs);
        t[t[u].ls].lazy^=1,t[t[u].rs].lazy^=1;
        t[u].lazy=0;
    }
}
inline void Split(int u,int k,int &L,int &R){
	if(u==0){L=R=0;return ;}
    push_down(u);
	if(k<=t[t[u].ls].size){
		R=u;
		Split(t[u].ls,k,L,t[u].ls);
	}
	else {
		L=u;
		Split(t[u].rs,k-t[t[u].ls].size-1,t[u].rs,R);
	}
	Update(u);
}
inline int Merge(int L,int R){
	if(!L||!R)return L+R;
	if(t[L].pri>t[R].pri){
        push_down(L);
		t[L].rs=Merge(t[L].rs,R);
		Update(L);
		return L;
	}
	else {
        push_down(R);
		t[R].ls=Merge(L,t[R].ls);
		Update(R);
		return R;
	}
}
inline void Insert(int x,int k){
	int L,R;
	Split(root,k-1,L,R);
	root=Merge(Merge(L,newNode(x)),R);
}
inline int Ask(int u){
	int s=t[t[u].ls].size+1,U;
	push_down(u);
	while(u!=root){
		U=u;
		u=fa[u];
		push_down(u);
		if(t[u].ls!=U)s+=t[t[u].ls].size+1;
	}
	return s;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n;
    for(int i=1;i<=n;i++){
        int x;cin>>x;
        Insert(x,i);
    }
    for(int i=1;i<=n;i++){
        int L,R,p;
        a[i]=Ask(id[i]);
        Split(root,a[i],L,R);
        Split(L,0,L,p);
        t[p].lazy^=1;
        root=Merge(Merge(L,p),R);
	}
    for(int i=1;i<=n;i++)cout<<a[i]<<' ';
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...