社区讨论

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 条回复,欢迎继续交流。

正在加载回复...