社区讨论
treap WA on #1#2
P3369【模板】普通平衡树参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lujz9qii
- 此快照首次捕获于
- 2024/04/03 23:43 2 年前
- 此快照最后确认于
- 2024/04/04 10:59 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10,inf=1145141919810ll;
struct mytreep{
struct node{
int son[2],v,siz,rd,num;
}t[N];
int root,pcnt;
void push_up(int p){
t[p].siz=t[p].num+t[t[p].son[0]].siz+t[t[p].son[1]].siz;
}
void move(int &p,int d){
int k=t[p].son[d^1];
t[p].son[d^1]=t[k].son[d];
t[k].son[d]=p;
push_up(p);
push_up(k);
p=k;
}
void insert(int &p,int x){
if(p==0){
p=++pcnt;
t[p].num=1;
t[p].v=x;
t[p].siz=1;
t[p].rd=rand();
return ;
}
if(t[p].v==x){
t[p].num++;
t[p].siz++;
return ;
}
int d=t[p].v<x;
insert(t[p].son[d],x);
if(t[t[p].son[d]].rd>t[p].rd)move(p,d^1);
push_up(p);
}
void erase(int &p,int x){
if(p==0)return ;
else if(x<t[p].v)erase(t[p].son[0],x);
else if(x>t[p].v)erase(t[p].son[1],x);
else{
if(!t[p].son[0]&&!t[p].son[1]){
t[p].siz--;t[p].num--;
if(t[p].num==0)p=0;
}
else if(t[p].son[0]&&!t[p].son[1]){
move(p,1);erase(t[p].son[1],x);
}
else if(!t[p].son[0]&&t[p].son[1]){
move(p,0);erase(t[p].son[0],x);
}
else{
int d=t[t[p].son[1]].rd<t[t[p].son[0]].rd;
move(p,d);erase(t[p].son[d],x);
}
}
push_up(p);
}
int rank(int &p,int x){
if(p==0)return 0;
if(t[p].v==x)return t[t[p].son[0]].siz+1;
if(x>t[p].v)return t[t[p].son[0]].siz+t[p].num+rank(t[p].son[1],x);
return rank(t[p].son[0],x);
}
int find(int &p,int x){
if(p==0)return 0;
if(t[t[p].son[0]].siz>=x)return find(t[p].son[0],x);
if(x>t[t[p].son[0]].siz+t[p].num)return find(t[p].son[1],x-t[t[p].son[0]].siz-t[p].num);
return t[p].v;
}
int pre(int &p,int x){
if(p==0)return -inf;
if(t[p].v>=x)return pre(t[p].son[0],x);
return max(t[p].v,pre(t[p].son[1],x));
}
int suc(int &p,int x){
if(p==0)return inf;
if(t[p].v<=x)return suc(t[p].son[1],x);
return min(t[p].v,suc(t[p].son[0],x));
}
}met;
int n;
signed main(){
cin>>n;
while(n--){
int op,x;scanf("%lld%lld",&op,&x);
if(op==1){
met.insert(met.root,x);
}
if(op==2){
met.erase(met.root,x);
}
if(op==3){
cout<<met.rank(met.root,x)<<"\n";
}
if(op==4){
cout<<met.find(met.root,x)<<"\n";
}
if(op==5){
cout<<met.pre(met.root,x)<<"\n";
}
if(op==6){
cout<<met.suc(met.root,x)<<"\n";
}
}
return 0;
}
完全看不出来错误在哪,求调
回复
共 0 条回复,欢迎继续交流。
正在加载回复...