替罪羊树RE了八个怎么办

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

rrrrr @ 2021-01-22 12:45:14


#include<bits/stdc++.h>
using namespace std;
const double alpha=0.75;
const int maxn=1100005;
struct st
{
    struct node
    {
        int l,r,v,vid,siz;
        bool dea;
        void nw(int x){l=r=0;siz=vid=1;dea=0;v=x;}
    }t[maxn];
    int mem[maxn];
    int rt,sum,cnt,idn;
    inline int bad(int o){return max((double)t[t[o].r].siz,(double)t[t[o].l].siz)>alpha*t[o].siz;}
    void clear()
    {
        rt=sum=cnt=idn=0;
    }
    void upda(int o)
    {
        t[o].siz=t[t[o].l].siz+t[t[o].r].siz+!t[o].dea;
        t[o].vid=t[t[o].l].vid+t[t[o].r].vid+!t[o].dea;
    }
    void dfs(int o)
    {
        if(!o)return;
        dfs(t[o].l);
        if(!t[o].dea)mem[idn++]=o;
        dfs(t[o].r);
        return;
    }
    int build(int l,int r)
    {
        if(l>=r) return 0;
        int mid=(l+r)>>1;
        int o=mem[mid];
        t[o].l=build(l,mid);
        t[o].r=build(mid+1,r);
        upda(o);
        return o;
    }
    inline void rebuild(int &o)
    {
        idn=0;
        dfs(o);
        o=build(0,idn);
    } 
    void insert(int &o,int val)
    {
        if(!o){o=++sum;t[o].nw(val);return;}
        t[o].siz++;t[o].vid++;
        if(val>=t[o].v) insert(t[o].r,val);
        else insert(t[o].l,val);
        if(bad(o))
        rebuild(o);
    }
    int gk(int o,int x)
    {
        int ans=1;
        while(o)
        if(t[o].v>=x) o=t[o].l;
        else ans+=t[t[o].l].vid+!t[o].dea,o=t[o].r;
        return ans;
    } 
    int kth(int o,int x)
    {
        while(o)
        {
            if(!t[o].dea&&t[t[o].l].vid+1==x) {return t[o].v;}
            if(t[t[o].l].vid>=x)o=t[o].l;
            else x-=t[t[o].l].vid+!t[o].dea,o=t[o].r; 
        }
    }
    int dete(int o,int x)
    {
        if(!t[o].dea&&t[t[o].l].vid+1==x)
        {
            t[o].dea=1;
            --t[o].vid;
            return 0;
        }
        --t[o].vid;
        if(x<=t[t[o].l].vid+!t[o].dea)dete(t[o].l,x);
        else dete(t[o].r,x-t[t[o].l].vid-!t[o].dea);
    }
}t;
inline int read()
{
    int x=0;bool f=0;char c=getchar();
    for(;!isdigit(c);c=getchar())f^=!(c^45);
    for(;isdigit(c);c=getchar()) x=(x*10)+(c^48);
    if(f)x=-x;return x;
}
int m,n,k,x,rt=0,lt=0,su=0;
int main()
{
    //freopen("P6136_1.in","r",stdin);  
    t.clear();
    m=read(),n=read();
    for(int i=1;i<=m;i++)
    {
        int x=read();
        t.insert(rt,x);
    }
    for(int i=1;i<=n;i++)
    {
        k=read();x=read();
        x=x^lt;
        if(k==1)
        {
            t.insert(rt,x); 
        } 
        if(k==2)
        {
            t.dete(rt,t.gk(rt,x)); 
        }
        if(k==3)
        {
            lt=t.gk(rt,x); su^=lt;
        }
        if(k==4)
        {
            lt=t.kth(rt,x);su^=lt;
        }
        if(k==5)
        {
            lt=t.kth(rt,t.gk(rt,x)-1);su^=lt;
        }
        if(k==6)
        {
            lt=t.kth(rt,t.gk(rt,x+1));su^=lt;
        }
    }
    printf("%d",su);
}```
本地跑能过,noilinux也能过,洛谷re
P3369相同的代码也过了。

by pigstd @ 2021-01-22 12:54:28

你需要请教 @Rainbow_sjy❤OI


by _LurminShax_ @ 2021-01-22 16:32:01

@rrrrr 请剪贴板,谢谢


by rrrrr @ 2021-01-22 16:46:51

this


|