fhqtreap挂了求救

P6136 【模板】普通平衡树(数据加强版)

exzang @ 2020-02-28 23:27:29

#include<bits/stdc++.h>
using namespace std;
const int N=5e6+5,SZ=N,inf=2147483647;
int tot,lc[SZ],rc[SZ],sz[SZ],rd[SZ],v[SZ],rt[2];
inline void update(int x){
    sz[x]=sz[lc[x]]+sz[rc[x]]+1;
}
inline void newnode(int &p,int val){
    p=++tot; rd[p]=rand(); v[p]=val; sz[p]=1;
}
inline void split(int now,int val,int &x,int &y){
    if(!now){
        x=y=0; return;
    }
    if(v[now]<=val){
        x=now;
        split(rc[now],val,rc[x],y);
    }
    else{
        y=now;
        split(lc[now],val,x,lc[y]);
    }
    update(now);
}
int merge(int a,int b){
    if(!a || !b) return a+b;
    if(rd[a]>rd[b]){
        rc[a]=merge(rc[a],b);
        update(a);
        return a;
    }
    else{   
        lc[b]=merge(a,lc[b]);
        update(b);
        return b;
    }
}
int x,y,z;
void Ins(int &p,int val){
    split(p,val,x,y);
    newnode(z,val);
    p=merge(merge(x,z),y);
}
void Del(int &p,int val){
    split(p,val,x,z);
    split(x,val-1,x,y);
    y=merge(lc[y],rc[y]);
    p=merge(merge(x,y),z);
}
int ans;
inline void Kth(int &p,int val){
    split(p,val-1,x,y);
    ans=sz[x]+1;
    p=merge(x,y);
    return;
} 
int Val(int p,int k){
    if(k==sz[lc[p]]+1) return v[p];
    if(k<=sz[lc[p]]) Val(lc[p],k);
    else Val(rc[p],k-sz[lc[p]]-1);
}
inline void Pre(int &p,int val){
    split(p,val-1,x,y);
    ans=Val(x,sz[x]);
    p=merge(x,y);
    return;
}
inline void Nxt(int &p,int val){
    split(p,val,x,y);
    ans=Val(y,1);
    p=merge(x,y);
    return;
}
int trans;
int main(){
    int n,m,v,opt,x;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i)
        scanf("%d",&x),
        Ins(rt[1],x);
    for(int i=1;i<=m;++i){
        scanf("%d%d",&opt,&x); x^=ans;
        switch(opt){
            case 1: Ins(rt[1],x); break;
            case 2: Del(rt[1],x); break;
            case 3: Kth(rt[1],x); trans^=ans; break;
            case 4: ans=Val(rt[1],x); trans^=ans; break;
            case 5: Pre(rt[1],x); trans^=ans; break;
            case 6: Nxt(rt[1],x); trans^=ans; break; 
        }
    }
    cout<<trans;
    return 0;
}

吐槽一下:这题测试数据都不给是几个意思?


by exzang @ 2020-02-28 23:30:16

主要是RE 0分,而且这个代码改一下直接过了可持久化平衡树 和 普通平衡树


by 万万没想到 @ 2020-02-28 23:31:07

首先你数组开大了,最大才1e6+1e5


by exzang @ 2020-02-28 23:31:41

我就是怕RE才开大的,结果还是RE


by exzang @ 2020-02-28 23:33:51

@万万没想到

1.我怕RE才开大

2.改成1e6+1e5,还是RE


by 万万没想到 @ 2020-02-28 23:34:00

第二,3456操作都要记录答案,你不记录不输出当然x会越界。


by exzang @ 2020-02-28 23:36:53

@万万没想到 ?啥答案 ans我存了啊


by exzang @ 2020-02-28 23:37:50

@Zhou_JK 小问题(


by 万万没想到 @ 2020-02-28 23:52:57

你的这个地方有点问题啊!

int Val(int p,int k){
    if(k==sz[lc[p]]+1) return v[p];
    if(k<=sz[lc[p]]) Val(lc[p],k);
    else Val(rc[p],k-sz[lc[p]]-1);
}

怎么会只有一个return?


by exzang @ 2020-02-28 23:58:09

@万万没想到 啊这...谢谢


by 万万没想到 @ 2020-02-29 00:00:33

不谢不谢,建议以后遇到这种码量大还查不出的题目就直接重构。


| 下一页