1 条题解

  • 1
    @ 2025-1-15 17:25:15
    #include <bits/stdc++.h>
    using namespace std;
    int q, n = 0, root = 0, aa, bb, cc, dd;
    int w[100003], siz[100003], ls[100003], rs[100003], val[100003];
    void upd(int x) 
    {
        siz[x] = siz[ls[x]] + siz[rs[x]] + 1;
    }
    int merge(int x, int y) 
    {
        if (!x || !y)
            return x + y;
    
        upd(x), upd(y);
    
        if (w[x] <= w[y]) 
        {
            rs[x] = merge(rs[x], y);
            upd(x);
            return x;
        } 
        else 
        {
            ls[y] = merge(x, ls[y]);
            upd(y);
            return y;
        }
    }
    void split(int x, int k, int &aa, int &bb) 
    {
        if (!x) 
        {
            aa = bb = 0;
            return;
        }
    
        if (val[x] <= k) 
        {
            aa = x;
            split(rs[x], k, rs[x], bb);
        } 
        else 
        {
            bb = x;
            split(ls[x], k, aa, ls[x]);
        }
    
        upd(x);
    }
    void insert(int x) 
    {
        w[++n] = rand();
        val[n] = x;
        siz[n] = 1;
        split(root, x, aa, bb);
        root = merge(merge(aa, n), bb);
    }
    void delet(int x) 
    {
        split(root, x, aa, bb);
        split(aa, x - 1, cc, dd);
        dd = merge(ls[dd], rs[dd]);
        root = merge(cc, merge(dd, bb));
    }
    int rk(int x, int k) 
    {
        split(root, k - 1, aa, bb);
        int l = siz[aa] + 1;
        root = merge(aa, bb);
        return l;
    }
    int vall(int x, int k) 
    {
        if (siz[ls[x]] + 1 == k)
            return val[x];
        else if (k <= siz[ls[x]])
            return vall(ls[x], k);
        else
            return vall(rs[x], k - siz[ls[x]] - 1);
    }
    int pre(int x) 
    {
        return vall(root, rk(root, x) - 1);
    }
    int aft(int x) 
    {
        return vall(root, rk(root, x + 1));
    }
    int main() 
    {
        scanf("%d", &q);
    
        while (q--) 
        {
            int opt, x;
            scanf("%d %d", &opt, &x);
    
            if (opt == 1)
                insert(x);
    
            if (opt == 2)
                delet(x);
    
            if (opt == 3)
                printf("%d\n", rk(root, x));
    
            if (opt == 4)
                printf("%d\n", vall(root, x));
    
            if (opt == 5)
                printf("%d\n", pre(x));
    
            if (opt == 6)
                printf("%d\n", aft(x));
        }
    
        return 0;
    }
    
    • 1

    信息

    ID
    5535
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者