社区讨论
Treap 80pts求助
P3369【模板】普通平衡树参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lo8pliv7
- 此快照首次捕获于
- 2023/10/27 22:29 2 年前
- 此快照最后确认于
- 2023/10/27 22:29 2 年前
第11个点我的输出和标准输出是一样的为什么还有“Too Short on line 1”的报错?
CPP#include<bits/stdc++.h>
using namespace std;
const int maxN=1e5+9,inf=1e8;
struct Node{
int l,r,val,pri,cnt,sz;
}t[maxN];
#define l(k) t[k].l
#define r(k) t[k].r
#define v(k) t[k].val
#define p(k) t[k].pri
#define c(k) t[k].cnt
#define s(k) t[k].sz
int n,rt,tot;
inline int read(){
int s=0,f=1;
char ch=getchar();
while (!isdigit(ch)){
if (ch='-') f=-1;
ch=getchar();
}
while (isdigit(ch)){
s=(s<<3)+(s<<1)+(ch^48);
ch=getchar();
}
return s*f;
}
inline void write(int x){
if (x<0) putchar('-'),x=-x;
if (x>9) write(x/10);
putchar(x%10+'0');
}
inline int crt(int x){
tot++;
v(tot)=x,p(tot)=rand(),c(tot)=s(tot)=1;
return tot;
}
inline void upt(int p){
s(p)=c(p)+s(l(p))+s(r(p));
}
inline int rnk(int p,int v){
if (p==0) return 0;
if (v(p)==v) return s(l(p))+1;
if (v(p)>v) return rnk(l(p),v);
return rnk(r(p),v)+s(l(p))+c(p);
}
inline int kth(int p,int k){
if (p==0) return inf;
if (s(l(p))>=k) return kth(l(p),k);
if (s(l(p))+c(p)>=k) return v(p);
return kth(r(p),k-s(l(p))-c(p));
}
inline void zig(int &p){
int q=l(p);
l(p)=r(q);
r(q)=p;
p=q;
upt(r(p)),upt(p);
}
inline void zag(int &p){
int q=r(p);
r(p)=l(q);
l(q)=p;
p=q;
upt(l(p)),upt(p);
}
inline void build(){
crt(-inf),crt(inf);
rt=1,r(rt)=2;
if (p(1)<p(2)) zag(rt);
}
inline void ins(int &p, int v){
if (p==0){
p=crt(v);
return;
}
if (v(p)==v){
c(p)++,upt(p);
return;
}
if (v(p)>v){
ins(l(p),v);
if (p(l(p))>p(p)) zig(p);
}
if (v(p)<v){
ins(r(p),v);
if (p(r(p))>p(p)) zag(p);
}
upt(p);
}
inline int pre(int p,int v){
if (!p) return -inf;
if (v(p)>=v) return pre(l(p),v);
int res=pre(r(p),v);
return res==-inf?v(p):res;
}
inline int nxt(int p,int v){
if (!p) return inf;
if (v(p)<=v) return nxt(r(p),v);
int res=nxt(l(p),v);
return res==inf?v(p):res;
}
inline void del(int &p,int v){
if (p==0) return;
if (v(p)==v){
if (c(p)>1){
c(p)--,upt(p);
return;
}
if (l(p)||r(p)){
if (r(p)==0||p(l(p))>p(r(p))) zig(p),del(r(p),v);
else zag(p),del(l(p),v);
upt(p);
}
else p=0;
return;
}
if (v(p)>v) del(l(p),v);
else del(r(p),v);
upt(p);
}
int main(){
build();
n=read();
while (n--){
int op=read(),x=read();
if (op<2) ins(rt,x);
else if (op<3) del(rt,x);
else if (op<4) write(rnk(rt,x)-1),puts("");
else if (op<5) write(kth(rt,x+1)),puts("");
else if (op<6) write(pre(rt,x)),puts("");
else write(nxt(rt,x)),puts("");
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...