社区讨论

平衡树神秘MLE30pts求调,悬关

P3369【模板】普通平衡树参与者 7已保存回复 18

讨论操作

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

当前回复
17 条
当前快照
1 份
快照标识符
@mkfatzp0
此快照首次捕获于
2026/01/15 18:20
上个月
此快照最后确认于
2026/01/18 11:40
上个月
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int n,opt,rt,cnt;
const int vr=2;
struct Node{
    int l,r,v,s;
}t[200005];
void merge(int &x,int a,int b){
    t[x=cnt+1]={a,b,t[b].v,t[a].s+t[b].s};
    cnt++;
    return ;
}
void push_up(int x){
    if(!t[x].l){
        t[x].l=1;
        return ;
    }
    t[x].s=t[t[x].l].s+t[t[x].r].s;
    t[x].v=t[t[x].r].v;
    return ;
}
void bal(int x){
    if(t[t[x].l].s>t[t[x].r].s*vr){
        merge(t[x].r,t[t[x].l].r,t[x].r);
        t[x].l=t[t[x].l].l;
    }
    else if(t[t[x].r].s>t[t[x].l].s*vr){
        merge(t[x].l,t[x].l,t[t[x].r].l);
        t[x].r=t[t[x].r].r;
    }
    return ;
}
void ins(int x,int v){
    if(!t[x].l){
        t[t[x].l=cnt+1]={0,0,min(v,t[x].v),1};cnt++;
        t[t[x].r=cnt+1]={0,0,max(v,t[x].v),1};cnt++;
    }else{
        ins((t[t[x].l].v>=v)?t[x].l:t[x].r,v);
    }
    push_up(x),bal(x);
    return ;
}
void dlt(int x,int v,int fa){
    if(!t[x].l){
        if(t[t[fa].l].v==v)t[fa]=t[t[fa].r];
        if(t[t[fa].r].v==v)t[fa]=t[t[fa].l];
    }else{
        dlt((t[t[x].l].v>=v)?t[x].l:t[x].r,v,x);
        push_up(x),bal(x);
    }
    return ;
}
int rnks(int x,int v){
    if(!t[x].l)return 1;
    else return (t[t[x].l].v>=v)?rnks(t[x].l,v):rnks(t[x].r,v)+t[t[x].l].s;
}
int k_max(int x,int s){
    if(t[x].s==s)return t[x].v;
    return (t[t[x].l].s>=s)?k_max(t[x].l,s):k_max(t[x].r,s-t[t[x].l].s);
}
signed main(){
    cin>>n;
    t[rt=1]={0,0,INT_MAX,1};
    cnt=1;
    for(int i=1;i<=n;i++){
        int opt,x;cin>>opt>>x;
        if(opt==1)ins(rt,x);
        if(opt==2)dlt(rt,x,-1);
        if(opt==3)cout<<rnks(rt,x)<<"\n";
        if(opt==4)cout<<k_max(rt,x)<<"\n";
        if(opt==5)cout<<k_max(rt,rnks(rt,x)-1)<<"\n";
        if(opt==6)cout<<k_max(rt,rnks(rt,x+1))<<"\n";
    }
    return 0;
}

基本就是对着题解打的了/ll 昨天一晚上没搞出来/ll

回复

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

正在加载回复...