求助 是妹子 刚学OI 洛谷RE acwing通过
查看原帖
求助 是妹子 刚学OI 洛谷RE acwing通过
150467
never_turn_right楼主2021/4/24 16:46

RT 代码:

#include<iostream>
#include<cstdlib>
#include<string>
using namespace std;
int mn,mx;
struct tree
{  
    int tot,rt;
    struct Node
    {
        int l,r;
        int rnd;
        int val;
        int siz;
    }tr[82005];
    int build(int valu,int x)
    {
        tr[valu].val=x;
        tr[valu].siz=1;
        tr[valu].rnd=rand();
        return valu;
    }
    int pushup(int x)
    {
        tr[x].siz=tr[tr[x].l].siz+tr[tr[x].r].siz+1;
    }
    int find(int root, int rank) 
    {
        while (root) 
        {
            if (tr[tr[root].l].siz+1==rank) break;
            if (tr[tr[root].l].siz>=rank) root=tr[root].l;
            else 
            {
                rank-=tr[tr[root].l].siz+1;
                root=tr[root].r;
            }
        }
        return root;
    }
    int find(int rank)
    {
        return find(rt,rank);
    }
    void split(int x,int k,int &l,int &r)
    {
        if(!x) {l=r=0;return;}
        if(tr[x].val<=k)
        {
            l=x;
            split(tr[x].r,k,tr[x].r,r);
            pushup(x);
        }
        else
        {
            r=x;
            split(tr[x].l,k,l,tr[x].l);
            pushup(x);
        }
    }
    int merge(int l,int r)
    {
        if(!l||!r)
            return l|r;
        if(tr[l].rnd<tr[r].rnd)
        {
            tr[l].r=merge(tr[l].r,r);
            pushup(l);
            return l;
        }
        else
        {
            tr[r].l=merge(l,tr[r].l);
            pushup(r);
            return r;
        }
    }
    void insert(int val,int p)
    {
        int x,y;
        split(rt,p,x,y);
        rt=merge(merge(x,build(val,p)),y);
    }
    void update(int val,int op)
    {
        int x,y,z;
        split(rt,tr[val].val,x,z);
        split(x,tr[val].val-1,x,y);
        if(op)
        {
            tr[val].val=--mn;
            rt=merge(merge(y,x),z);
        }
        else
        {
            tr[val].val=++mx;
            rt=merge(merge(x,z),y);
        }
    }
    void reverse(int val,int op)
    {
        if(!op) return;
        if(op==1)
        {
            int x,y,z,w;
            split(rt,tr[val].val,x,z);
            split(x,tr[val].val-1,x,y);
            int t=find(z,1);
            split(z,tr[t].val,z,w);
            swap(tr[y].val,tr[z].val);
            rt=merge(merge(x,z),merge(y,w));
        }
        else
        {
            int x,y,z,w;
            split(rt,tr[val].val-1,x,z);
            split(z,tr[val].val,z,w);
            int t=find(x,tr[x].siz);
            split(x,tr[t].val-1,x,y);
            swap(tr[y].val,tr[z].val);
            rt=merge(merge(x,z),merge(y,w));
        }
    }
    int rank(int val)
    {
        int x,y,ans;
        split(rt,tr[val].val-1,x,y);
        ans=tr[x].siz;
        rt=merge(x,y);
        return ans;
    }
}tree;
int n,m;
string a;
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        tree.insert(x,i);
    }
    mn=1,mx=n;
    for(int i=1;i<=m;i++)
    {
        int x,t;
        cin>>a>>x;
        if(a[0]=='T')
            tree.update(x,1);
        else if(a[0]=='B')
            tree.update(x,0);
        else if(a[0]=='I')
            cin>>t,tree.reverse(x,t);
        else if(a[0]=='A')
            cout<<tree.rank(x)<<endl;
        else 
            cout<<tree.find(x)<<endl;
    }
    return 0;
}
2021/4/24 16:46
加载中...