社区讨论
求条,样例过不了
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 条回复,欢迎继续交流。
正在加载回复...