社区讨论

Splay求调

P4402[CERC2007] robotic sort 机械排序参与者 4已保存回复 4

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@lqgphg0o
此快照首次捕获于
2023/12/22 22:07
2 年前
此快照最后确认于
2023/12/23 09:29
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
inline int read(){
    char ch=getchar();int x=0;bool f=1;
    while(ch<'0'||'9'<ch){if(ch=='-')f=0;ch=getchar();}
    while('0'<=ch&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    return f?x:-x;
}
int n,m;
const int N=1e5+5,inf=0x3f3f3f3f;
int id[N];
#define ls(x) spl[x].ch[0]
#define rs(x) spl[x].ch[1]
struct node{
    int fa,ch[2],val,siz,lazy;
}spl[N];
int cnt,root=0;
void newnode(int &now,int fa,int val){
    spl[now=++cnt].val=val;
    spl[now].fa=fa;
    spl[now].siz=1;
    spl[now].lazy=0;
    id[val]=cnt;
}
inline void update(int now){
    spl[now].siz=spl[ls(now)].siz+spl[rs(now)].siz+1;
}
inline void pushdown(int now){
    if(spl[now].lazy){
        swap(ls(now),rs(now));
        spl[ls(now)].lazy^=1;
        spl[rs(now)].lazy^=1;
        spl[now].lazy=0;
    }
    return;
}
inline bool ident(int x,int f){return rs(f)==x;}
inline void connect(int x,int f,int s){
    spl[f].ch[s]=x;spl[x].fa=f;
}
inline void rotate(int x){
    int f=spl[x].fa,ff=spl[f].fa;
    pushdown(f);pushdown(x);
    int k=ident(x,f);
    connect(spl[x].ch[k^1],f,k);
    connect(x,ff,ident(f,ff));
    connect(f,x,k^1);
    update(f),update(x);
}
void splaying(int x,int top){
    if(!top)root=x;
    while(spl[x].fa!=top){
        int f=spl[x].fa,ff=spl[f].fa;
        if(ff!=top)ident(f,ff)^ident(x,f)?rotate(x):rotate(f);
        rotate(x);
    }
}
inline int suf(){
    int now=root;
    pushdown(now);
    now=rs(now);
    while(ls(now))pushdown(now),now=ls(now);
    return now;
}
pair<int,int>a[N];
void build(int l,int r,int &now,int fa){
    int mid=(l+r)>>1;
    newnode(now,fa,a[mid-1].second);
    if(l<mid)build(l,mid-1,ls(now),now);
    if(mid<r)build(mid+1,r,rs(now),now);
    update(now);
}
signed main(){
    // freopen(".in","r",stdin);
    // freopen(".out","w",stdout);
    n=read();
    for(int i=1;i<=n;i++)a[i]={read(),i};
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++)a[i]={a[i].second,i};
    sort(a+1,a+n+1);
    a[0]={0,0};
    a[n+1]={n+1,n+1};
    build(1,n+2,root,0);
    for(int i=1;i<=n;i++){
        int l=id[i-1],r=id[i];
        splaying(r,0);
        printf("%d ",spl[ls(r)].siz);
        r=suf();
        splaying(l,0);splaying(r,l);
        spl[ls(r)].lazy^=1;
    }
    return 0;
}
调2h了。。

回复

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

正在加载回复...