这题用平衡树是对的吗
查看原帖
这题用平衡树是对的吗
891245
R_aier楼主2023/8/27 22:09

20 pts求助

#include <bits/stdc++.h>
#define AC return 0;
#define LOCAL
#define int long long
using namespace std;
const int maxn = 3e5 + 10;
int n, m,  q, k;
int ans = 0, T;
void read(int &x)
{
    int f = 0;
    x = 0;
    char ch = getchar();
    while (!isdigit(ch))
    {
        if (ch == '-')
            f = 1;
        ch = getchar();
    }
    while (isdigit(ch))
    {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    f ? x = -x : 0;
}
void read(int &x, int &y)
{
    read(x);
    read(y);
}
struct treap
{
    struct fhq
    {
        int ls, rs;
        int siz, pri, st, ed, Max;
        fhq() {}
        fhq(int val) : siz(val), pri(rand()), ed(val), Max(val),ls(0),rs(0),st(1) {}
    } t[maxn];
    int cnt, root;
    void push_up(int p)
    {
        t[p].siz = t[t[p].ls].siz + t[t[p].rs].siz + t[p].ed - t[p].st + 1;
        t[p].Max = max(t[p].ed, max(t[t[p].ls].Max, t[t[p].rs].Max));
    }
    int merge(int L, int R)
    {
        if (!L || !R)
            return L + R;
        if (t[L].pri > t[R].pri)
        {
            t[L].rs = merge(t[L].rs, R);
            push_up(L);
            return L;
        }
        else
        {
            t[R].ls = merge(L, t[R].ls);
            push_up(R);
            return R;
        }
    }
    void instert(int x)
    {
        t[++cnt] = fhq(x);
        root = merge(root, cnt);
    }
    void pop(int u, int &x)
    {
        if (!t[u].ls)
        {
            if (x < t[u].siz)
            {
                t[u].st += x;
                t[u].siz -= x;
                x = -1;
            }
            else
            {
                x -= t[u].siz;
                t[u].siz = 0;
                t[u].st=t[u].ed=0;
            }
        }
        else
        {
            pop(t[u].ls, x);
            if (~x)
            {
                t[u].ls = t[t[u].ls].rs;
                if (x < t[u].siz)
                {
                    t[u].st += x;
                    t[u].siz -= x;
                    x = -1;
                }
                else
                {
                    x -= t[u].siz;
                    t[u].siz = 0;
                    t[u].st = t[u].ed = 0;
                }
            }
        }
        push_up(u);
    }
    void pop(int x)
    {
        pop(root, x);
        if (!t[root].siz)
            root = t[root].rs;
    }
    int find(int u,int x)
    {
        if (x > t[t[u].ls].siz && x <= (t[t[u].ls].siz - t[u].st + t[u].ed + 1))
        {
            x -= t[t[u].ls].siz + 1;
            x += t[u].st;
            return x;
        }
        else if (x > (t[t[u].ls].siz - t[u].st + t[u].ed + 1))
            return find(t[u].rs, x - (t[t[u].ls].siz - t[u].st + t[u].ed + 1));
        return find(t[u].ls,x);
    }
    int find(int x)
    {
        return find(root,x);
    }
    int findmax()
    {
        return t[root].Max;
    }
} t;
void solve()
{
    int opt, x;
    while (T--)
    {
        read(opt);
        switch (opt)
        {
        case 1:
            read(x);
            t.instert(x);
            break;
        case 2:
            read(x);
            t.pop(x);
            break;
        case 3:
            read(x);
            printf("%lld\n",t.find(x));
            break;
        case 4:
            printf("%lld\n",t.findmax());
            break;
        }
    }
}
void init()
{
    read(n, T);
}
signed main()
{
#ifdef LOCAL
    freopen("in.in", "r", stdin);
    freopen("out.out", "w", stdout);
#endif
    init();
    solve();
    AC
}
2023/8/27 22:09
加载中...