96 pts求调!
查看原帖
96 pts求调!
1164692
lijianACE楼主2025/1/5 16:59

WA了最后一个点。

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int root[N],cnt=0;
struct Node{
    int ls,rs,key,pri,size;
};
Node tree[N*50];
void update(int p){
    tree[p].size=tree[tree[p].ls].size+tree[tree[p].rs].size+1;
}
void newnode(int x){
    tree[++cnt].size=1;
    tree[cnt].ls=0;
    tree[cnt].rs=0;
    tree[cnt].key=x;
    tree[cnt].pri=rand();
}
int findk(int p,int k){
    if(k==tree[tree[p].ls].size+1) return p;
    if(k<=tree[tree[p].ls].size) return findk(tree[p].ls,k);
    else return findk(tree[p].rs,k-tree[tree[p].ls].size-1);
}
void split(int p,int x,int &L,int &R){
    if(p==0){
        L=0;
        R=0;
        return;
    }
    if(tree[p].key<=x){
        L=p;
        split(tree[p].rs,x,tree[p].rs,R);
    }
    else{
        R=p;
        split(tree[p].ls,x,L,tree[p].ls);
    }
    update(p);
}
int Merge(int L,int R){
    if(L==0||R==0) return L+R;
    if(tree[L].pri>tree[R].pri){
        tree[L].rs=Merge(tree[L].rs,R);
        update(L);
        return L;
    }
    else{
        tree[R].ls=Merge(L,tree[R].ls);
        update(R);
        return R;
    }
}
void insert(int x,int v){
    int L,R;
    split(root[v],x,L,R);
    newnode(x);
    int rp=Merge(L,cnt);
    root[v]=Merge(rp,R);
}
void del(int x,int v){
    int L,R,p;
    split(root[v],x,L,R);
    split(L,x-1,L,p);
    p=Merge(tree[p].ls,tree[p].rs);
    root[v]=Merge(Merge(L,p),R);
}
void rankx(int x,int v){
    int L,R;
    split(root[v],x-1,L,R);
    printf("%d\n",tree[L].size+1);
    root[v]=Merge(L,R);
}
void prinx(int p,int k){
    printf("%d\n",tree[findk(p,k)].key);
}
void prec(int x,int v){
    int L,R;
    split(root[v],x-1,L,R);
    if(!L) printf("-2147483647\n");
    else prinx(L,tree[L].size);
    root[v]=Merge(L,R);
}
void succ(int x,int v){
    int L,R;
    split(root[v],x,L,R);
    if(!R) printf("2147483647\n");
    else prinx(R,1);
    root[v]=Merge(L,R);
}
int main(){
    srand(time(NULL));
    int n,op,x,v,vers=0;
    scanf("%d",&n);
    while(n--){
        scanf("%d%d%d",&v,&op,&x);
        root[++vers]=root[v];
        switch(op){
            case 1:insert(x,vers);break;
            case 2:del(x,vers);break;
            case 3:rankx(x,vers);break;
            case 4:prinx(root[v],x);break;
            case 5:prec(x,vers);break;
            case 6:succ(x,vers);break;
        }
    }
    return 0;
}

附数据:
输入:
6
0 1 1
1 1 2
2 1 3
3 2 2
3 2 3
3 3 3
输出:
3

2025/1/5 16:59
加载中...