萌新妹子刚学OI 1e-10秒,求调替罪羊

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

herselfqwq @ 2021-11-14 21:05:21

RT,最近在学替罪羊,感觉大家都写得Splay,是这个题他卡替罪羊吗?怎么全T了?求挑错/kk

#include<bits/stdc++.h>
#define il inline
#define re register
#define ll long long
const int N=1e5+5,inf=0x3f3f3f3f,old=19260817;
const double seed=0.75;
il int R () {
    re int s=0,f=1;re 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;
}
int n,m,lastans,ans,val[N],rnd[N],tot,son[N][2],siz[N][3],f[N],root=1;
//siz[i][1]表示真正大小,siz[i][2]表示存在的点的大小,f[i]表示是否存在
il int check (int p) {
    double fa=(double)1.0*siz[p][2]*seed;
    double lc=(double)1.0*siz[son[p][0]][2],rc=(double)1.0*siz[son[p][1]][2];
    return fa>=std::max(lc,rc);
}
std::vector<int> vec,mem;
il void dfs (int p) {
    if (!p) return ;
    dfs(son[p][0]);
    if (f[p]) vec.push_back(p);
    else mem.push_back(p);
    dfs(son[p][1]);
}
il void pushup (int p) {
    siz[p][1]=siz[son[p][0]][1]+siz[son[p][1]][1]+1;
    siz[p][2]=siz[son[p][0]][2]+siz[son[p][1]][2]+1;
}
il void build (int l,int r,int &p) {
    int mid=(l+r)>>1;
    p=vec[mid];
    if (l==r) {
        son[p][0]=son[p][1]=0;
        siz[p][1]=siz[p][2]=1;
        return ;
    }
    if (l<mid) build(l,mid-1,son[p][0]);
    else son[p][0]=0;
    build(mid+1,r,son[p][1]);
    pushup(p);
}
il void rebuild (int &p) {
    vec.clear();
    vec.push_back(inf);
    dfs(p);
    if (vec.size()!=1) build(1,vec.size()-1,p);
    else p=0;
}
il void insert (int &p,int k) {
    if (!p) {
        p=mem.back(),mem.pop_back();
        val[p]=k;
        f[p]=siz[p][1]=siz[p][2]=1;
        son[p][0]=son[p][1]=0;
        return ;
    }
    siz[p][1]++,siz[p][2]++;
    if (val[p]>=k) insert(son[p][0],k);
    else insert(son[p][1],k);
    if (!check(p)) rebuild(p);
}
il void del (int &p,int k) { //删除排名k
    if (f[p]&&siz[son[p][0]][2]+1==k) {
        f[p]=0,siz[p][2]--;
        return ;
    }
    siz[p][2]--;
    if (siz[son[p][0]][2]+f[p]>=k) del(son[p][0],k);
    else del(son[p][1],k-siz[son[p][0]][2]-f[p]);
}
il int getrank (int k) { //寻找排名为k的数
    int p=root;
    while (p) {
        if (f[p]&&siz[son[p][0]][2]+1==k) return val[p];
        else if (siz[son[p][0]][2]>=k) p=son[p][0];
        else k-=siz[son[p][0]][2]+f[p],p=son[p][1];
    }
}
il int getnum (int k) { //寻找k的排名
    int p=root,ret=1;
    while (p) {
        if (val[p]>=k) p=son[p][0];
        else ret+=siz[son[p][0]][2]+f[p],p=son[p][1];
    }
    return ret;
}
il void Herself64akioi (int k) {
    del(root,getnum(k));
    if ((double)1.0*siz[root][1]*seed>=(double)siz[root][2]) rebuild(root);
}
int main () {
    n=R(),m=R();
    for (int i=4*N;i>=1;i--) mem.push_back(i);
    for (int i=1;i<=n;i++) insert(root,R());
    while (m--) {
        int op=R(),x=R();x^=lastans;
        if (op==1) insert(root,x);
        if (op==2) Herself64akioi(x);
        if (op==3) lastans=getnum(x),ans^=lastans;
        if (op==4) lastans=getrank(x),ans^=lastans;
        if (op==5) lastans=getrank(getnum(x)-1),ans^=lastans;
        if (op==6) lastans=getrank(getnum(x+1)),ans^=lastans;
//      std::cout<<op<<' '<<x<<' '<<lastans<<'\n';
    }
    printf("%d",ans);
    return 0;
}

by ioker @ 2021-11-14 21:07:35

btd


by ssytxy2024 @ 2021-11-14 21:08:14

1e-10秒


by Buckbeak @ 2021-11-14 21:09:59

萌新暴击-100

妹子暴击-50

1e-10秒暴击-1e10


by herselfqwq @ 2021-11-14 21:23:30

嘤您们不要fAKe了


by ioker @ 2021-11-14 21:34:51

萌新暴击-100\times10^{10}

妹子暴击-50\times10^{10}

1e-10秒暴击-10^{10}


by Setoff @ 2021-11-14 22:36:53

不卡。

估计是你写挂了。

不想帮你调。

/xyx


by herselfqwq @ 2021-11-15 08:40:47

@うん、幸せ 草


by 林聪 @ 2021-11-25 18:58:23

@Herself64 不卡,我用替罪羊过了


|