求助!
查看原帖
求助!
1164692
lijianACE楼主2024/12/29 19:26

用FHQ Treap,全炸,基本TLE,一,二和最后一个点WA。

#include<bits/stdc++.h>
using namespace std;
const int M=1e6+10;
int root=0,cnt=0;
struct Node{
    int ls,rs,key,pri,size;
};
Node tree[M];
void update(int p){
    tree[p].size=tree[tree[p].ls].size+tree[tree[p].rs].size;
}
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 L,R;
    split(root,x,L,R);
    newnode(x);
    int rp=merge(L,cnt);
    root=merge(rp,R);
}
void del(int x){
    int L,R,p;
    split(root,x,L,R);
    split(L,x-1,L,p);
    p=merge(tree[p].ls,tree[p].rs);
    root=merge(merge(L,p),R);
}
void rankx(int x){
    int L,R;
    split(root,x-1,L,R);
    printf("%d\n",tree[L].size+1);
    root=merge(L,R);
}
void prinx(int p,int k){
    printf("%d\n",tree[findk(p,k)].key);
}
void prec(int x){
    int L,R;
    split(root,x-1,L,R);
    prinx(L,tree[L].size);
    root=merge(L,R);
}
void succ(int x){
    int L,R;
    split(root,x,L,R);
    prinx(R,1);
    root=merge(L,R);
}
int n,op,x;
int main(){
    srand(time(NULL));
    scanf("%d",&n);
    while(n--){
        scanf("%d%d",&op,&x);
        switch(op){
            case 1:insert(x);break;
            case 2:del(x);break;
            case 3:rankx(x);break;
            case 4:prinx(root,x);break;
            case 5:prec(x);break;
            case 6:succ(x);break;
        }
    }
    return 0;
}
2024/12/29 19:26
加载中...