块状数组96pts求调试

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

Mugino_Shizuri @ 2024-07-10 17:11:58

自己胡的写法,可能有锅。

在执行操作2时RE。

#include<bits/stdc++.h>

using namespace std;

inline int read(){
    int x=0,f=0;
    char c=getchar();
    while(c<'0'||c>'9'){f|=(c=='-');c=getchar();}
    while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+c-'0';c=getchar();}
    return f?-x:x;
}

struct node{
    node *ne;
    vector < int > d;
    node(){d.clear();ne=NULL;}
    inline void pop(){d.pop_back();}
    inline int size(){return d.size();}
    inline int back(){return d.back();}
    inline bool empty(){return d.empty();}
    inline void push(const int x){d.emplace_back(x);}
    inline void erase(const int x){d.erase(lower_bound(d.begin(),d.end(),x));}
    inline void insert(const int x){d.insert(lower_bound(d.begin(),d.end(),x),x);}
    inline int rank(const int x){return distance(d.begin(),lower_bound(d.begin(),d.end(),x));}
}*h=NULL,*tmp,*r;
int n,lenth=1100,ans,las,m;

inline void check(node *x){
    if(x->size()>=(lenth<<1)){
        node *p=new node;
        for(int i=lenth;i<x->size();++i) p->push(x->d[i]);
        x->d.resize(lenth);p->ne=x->ne;x->ne=p;
        return ;
    }
}

inline void insert(const int x){
    for(r=h;r->ne!=NULL;r=r->ne) if(r->empty()||r->back()>=x) break;
    r->insert(x);check(r);
}

inline void erase(const int x){
    for(r=h;r->ne!=NULL;r=r->ne) if(r->back()>=x) break;
    r->erase(x);check(r);
}

inline int queryrank(const int x){
    int res=0;
    for(r=h;r->ne!=NULL;r=r->ne){
        if(r->back()>=x) break;
        res+=r->size();
    }
    return res+r->rank(x)+1;
}

inline int kth(int k){
    for(r=h;r->ne!=NULL;r=r->ne){
        if(k>r->size()) k-=r->size();
        else break;
    }
    return r->d[k-1];
}
inline int pre(const int x){return kth(queryrank(x)-1);}
inline int suf(const int x){return kth(queryrank(x+1));}

int main(){
    n=read();m=read();h=new node;
    for(int i=1;i<=n;++i) insert(read());
    for(int i=1,opt,x;i<=m;++i){
        opt=read();x=read()^las;
        if(opt==1) insert(x);
        else if(opt==2) erase(x);
        else if(opt==3) las=queryrank(x);
        else if(opt==4) las=kth(x);
        else if(opt==5) las=pre(x);
        else las=suf(x);
        if(opt>=3) ans^=las;
    }
    printf("%d\n",ans);
    return 0;
}

by Mugino_Shizuri @ 2024-07-10 17:12:56

说错了,块状链表。


by Mugino_Shizuri @ 2024-07-10 17:21:36

是用正解代码解码后的操作 2,也就是不存在解码错误导致RE。


by Mugino_Shizuri @ 2024-07-10 17:23:38

去掉 check 就是对的。


by Guchenxi0971 @ 2024-07-10 17:29:12

@Mugino_Shizuri 有数据吗?


by Mugino_Shizuri @ 2024-07-10 17:35:53

@Guchenxi0971 大小一百万,要的话我挂 ACing里(解码后的数据)。


by Mugino_Shizuri @ 2024-07-10 17:38:33

@Guchenxi0971 块链没判空,我naive了。


by Guchenxi0971 @ 2024-07-10 17:40:36

@Mugino_Shizuri 不好评价你。


|