mxqz FHQ 20pts
查看原帖
mxqz FHQ 20pts
539133
q1uple楼主2023/3/14 09:44
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+5;
struct FHQ{
    int l,r,size,val,key;// l r 儿子 size 第k大 val 权值 key 随机值
} tr[N];
int idx=0,root;

void pushup(int u)
{
    tr[u].size=tr[tr[u].l].size+tr[tr[u].r].size+1;
}

int newnode(int val)
{
    tr[++idx].val=val;tr[idx].key=rand();tr[idx].size=1;
    return idx;
}

void spilt(int u,int v,int &x,int &y)
{
    if(!u)  {   x=y=0; return; }
    if(tr[u].val<=v)
    {
        x=u;
        spilt(tr[x].r,v,tr[x].r,y);
    }
    else
    {
        y=u;
        spilt(tr[y].l,v,x,tr[y].l);
    }
    pushup(u);
}

int merge(int x,int y)
{
    if(!x||!y)
        return x+y;
    if(tr[x].key<tr[y].key)
    {
        tr[x].r=merge(tr[x].r,y);
        pushup(x);  return x;
    }
    else
    {
        tr[y].l=merge(x,tr[y].l);
        pushup(y);  return y;
    }
}

void insert(int val)
{
    int x=0,y=0;
    spilt(root,val,x,y);
    root=merge(merge(x,newnode(val)),y);
}

void deleted(int val)
{
    int x=0,y=0,z=0;
    spilt(root,val,x,z);
    spilt(root,val-1,x,y);
    y=merge(tr[y].l,tr[y].r);
    root=merge(merge(x,y),z);
}
int get_k(int u,int k)
{
    if(k<=tr[tr[u].l].size)
        get_k(tr[u].l,k);
    else if(k==tr[tr[u].l].size+ 1)
        return u;
    return get_k(tr[u].r,k-tr[tr[u].l].size-1);
}
int get_pre(int val)
{
    int x=0,y=0;
    spilt(root,val-1,x,y);
    int p=get_k(x,tr[x].size);
    int ans=tr[p].val;
    root=merge(x,y);
    return ans;
}


int get_last(int val)
{
    int x=0,y=0;
    spilt(root,val,x,y);
    int p=get_k(y,1);
    int ans=tr[p].val;
    root=merge(x,y);
    return ans;
}

int get_rank(int val)
{
    int x=0,y=0;
    spilt(root,val-1,x,y);
    int ans=tr[x].size+1;
    root=merge(x,y);
    return ans;
}

int get_val(int u)
{
    int p=get_k(root,u);
    return tr[p].val;   
} 

int main()
{
    srand(time(NULL));
    int n;
    cin >> n;
    while (n --)
    {
        int opt,x;
        cin>>opt>>x;

        if(opt==1)  insert(x);
        if(opt==2) deleted(x);
        if(opt==3) cout<<get_rank(x)<<endl;
        if(opt==4) cout<<get_val(x)<<endl;
        if(opt==5) cout<<get_pre(x)<<endl;
        if(opt==6)  cout<<opt<<get_last(x)<<endl;
    }
}

2023/3/14 09:44
加载中...