90分代码求调

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

linlioo @ 2021-12-16 14:54:29

90分T了一个点,会的全用了,求大佬教一下

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int l,r,cnt,siz,key,data;
}a[1100010];
int w,last,sum;
inline int read()
{
    int X=0; bool flag=1; char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
    while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
    if(flag) return X;
    return ~(X-1);
}
inline void pushup(int k)
{
    a[k].siz=a[k].cnt+a[a[k].l].siz+a[a[k].r].siz;
}
inline void right_zig(int &k)
{
    int kk=a[k].l;
    a[k].l=a[kk].r;
    a[kk].r=k;
    pushup(k);
    pushup(kk);
    k=kk;
}
inline void left_zig(int &k)
{
    int kk=a[k].r;
    a[k].r=a[kk].l;
    a[kk].l=k;
    pushup(k);
    pushup(kk);
    k=kk;
}
inline void inser(int &k,int q)
{
    if(k==0)
    {
        k=++w;
        a[k].cnt=1;
        a[k].data=q;
        a[k].key=rand();
        pushup(k);
    }
    else if(a[k].data==q)
    {
        a[k].cnt++;
        pushup(k);
    }
    else if(a[k].data>q)
    {
        inser(a[k].l,q);
        if(a[a[k].l].key<a[k].key)
        {
            right_zig(k);
        }
        else 
        {
            pushup(k);
        }
    }
    else 
    {
        inser(a[k].r,q);
        if(a[a[k].r].key<a[k].key)
        {
            left_zig(k);
        }
        else 
        {
            pushup(k);
        }
    }
}
inline void delet(int k,int q)
{
    if(a[k].data>q)
    {
        delet(a[k].l,q);
    }
    else if(a[k].data<q)
    {
        delet(a[k].r,q);
    }
    else 
    {
        a[k].cnt--;
    }
    pushup(k);
}
inline int ran(int k,int q)
{
    pushup(k);
    if(k==0)
    {
        return 0;
    }
    if(a[k].data>q)
    {
        return ran(a[k].l,q);
    }
    else if(a[k].data<q)
    {
        return ran(a[k].r,q)+a[k].cnt+a[a[k].l].siz;
    }
    else return a[a[k].l].siz;
}
inline void find(int k,int q)
{
    if(a[a[k].l].siz>=q)
    {
        find(a[k].l,q);
    }
    else if(a[a[k].l].siz+a[k].cnt<q)
    {
        find(a[k].r,q-a[k].cnt-a[a[k].l].siz);
    }
    else 
    {
        int ans=a[k].data;
        sum^=ans;
        last=ans;
        return ;
    }
}
inline int lower(int k,int q)
{
    if(k==0)
    {
        return -2100000000;
    }
    if(a[k].data>=q)
    {
        return lower(a[k].l,q);
    }
    else 
    {
        if(a[k].cnt)
        return max(a[k].data,lower(a[k].r,q));
        else return max(lower(a[k].r,q),lower(a[k].l,q));
    }
}
inline void write(int X)
{
    if(X<0) {X=~(X-1); putchar('-');}
    if(X>9) write(X/10);
    putchar(X%10+'0');
}

inline int upper(int k,int q)
{
    if(k==0)
    {
        return 2100000000;
    }
    else if(a[k].data<=q)
    {
        return upper(a[k].r,q);
    }
    else
    {
        if(a[k].cnt)
        return min(upper(a[k].l,q),a[k].data);
        else return min(upper(a[k].l,q),upper(a[k].r,q)); 
    }
}
int main(int argc, char const *argv[])
{
    int root=0,n,m;
    n=read();
    m=read();
    while(n--)
    {
        int k=read();
        inser(root,k);
    }
    for(int i=1;i<=m;i++)
    {
        int k=read(),q=read();
        q^=last;
        if(k==1)
        {
            inser(root,q);
        }
        else if(k==2) 
        {
            delet(root,q);
        }
        else if(k==3)
        {
            int ans=ran(root,q)+1;
            sum^=ans;
            last=ans;
        }
        else if(k==4)
        {
            find(root,q);
        }
        else if(k==5)
        {
            int ans=lower(root,q);
            sum^=ans;
            last=ans;
        }
        else 
        {
            int ans=upper(root,q);
            sum^=ans;
            last=ans;
        }
    }
    write(sum);
    return 0;
}

by DesignDigits @ 2021-12-16 16:14:17

O2


by linlioo @ 2021-12-16 16:28:28

@Codezhu 这道题不是本来就默认O2吗?


by Z_301 @ 2021-12-24 19:10:03

@linlioo 几个卡常小建议:


|