无指针Splay囚猪,马风不一定良好
查看原帖
无指针Splay囚猪,马风不一定良好
1096564
LZMqueueNB楼主2023/10/23 21:58

rt

#include<bits/stdc++.h>
#define M(x,y) memset(x,y,sizeof(x))
#define rep(i,x,y) for(int i=(x);i<=(y);++i)
#define per(i,x,y) for(int i=(x);i>=(y);--i)
inline int max(int a,int b){return a>b?a:b;}
inline int min(int a,int b){return a<b?a:b;}
inline void swap(int & x,int & y){x^=y^=x^=y;}
inline int read()
{
    int x=0,s=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar())if(ch=='-')s=-1;
    for(;isdigit(ch);ch=getchar())x=x*10+ch-48;
    return x*s;
}

const int N=200010;
const int INF=INT_MAX;

namespace Splay
{
    int root;
    struct trees
    {
        int cnt,siz,fa,val;
        int ch[2];
    }node[N];
    int cnt;
    void updata(int x){node[x].siz=node[node[x].ch[0]].siz+node[node[x].ch[1]].siz+node[x].cnt;}
    int get(int x){return node[node[x].fa].ch[1]==x;}
    void cnct(int x,int fa,int f){node[fa].ch[f]=x;node[x].fa=fa;}

    void rotate(int x)
    {
        int y=node[x].fa,z=node[y].fa;
        int f=get(x);
        cnct(x,z,get(y));
        cnct(node[x].ch[f^1],y,f);
        cnct(y,x,f^1);
        updata(x);updata(y);
    }

    void splay(int x,int goal)
    {
        for(;node[x].fa^goal;rotate(x))
        {
            int y=node[x].fa,z=node[y].fa;
            if(z^goal)node[z].ch[1]^y^node[y].ch[1]^x?rotate(x):rotate(y);
        }
        if(!goal)root=x;
    }

    void insert(int x)
    {
        int u=root,fa=0;
        while(x^node[u].val && u)fa=u,u=node[u].ch[x>node[u].val];
        if(u)node[u].cnt++;
        else
        {
            u=++cnt;
            if(fa)node[fa].ch[x>node[fa].val]=u;
            node[u].cnt=node[u].siz=1;
            node[u].fa=fa;
            node[u].val=x;
            node[u].ch[0]=node[u].ch[1]=0;
        }
        splay(u,0);
    }

    void find(int x)
    {
        int u=root;
        if(!u)return ;
        while(x^node[u].val && node[u].ch[x>node[u].val])u=node[u].ch[x>node[u].val];
        splay(u,0);
    }

    int kth(int x)
    {
        int u=root;
        if(node[u].siz<x)return 0;
        while(true)
        {
            int y=node[u].ch[0];
            if(node[u].cnt+node[y].siz<x)
            {
                x-=node[u].cnt+node[y].siz;
                u=node[u].ch[1];
            }
            else if(node[y].siz>=x)u=y;
            else return node[u].val;
        }
    }
}using namespace Splay;

signed main()
{
    int n=read();
    insert(INF);insert(-INF);
    rep(i,1,n)insert(read());
    rep(i,1,n)printf("%lld ",kth(i+1));
    return 0;
}
2023/10/23 21:58
加载中...