社区讨论
平衡树神秘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 条回复,欢迎继续交流。
正在加载回复...