为啥这样不行
查看原帖
为啥这样不行
340119
_Sparkle楼主2025/5/22 16:41
#include <iostream>

using namespace std;

const int maxn = 2e5 + 10, inf = 2147483647;

int n;

int RT[maxn], tot, cnt;
int rand()
{
    static unsigned long long rd = 23333;
    return (rd *= 2333) %= 2147483647;
}

struct node
{
    int siz;
    int ch[2];
    int data, val;
} t[maxn * 20];
int newnode(int x)
{
    t[++cnt].val = x, 
    t[cnt].siz = 1,
    t[cnt].data = rand(),
    t[cnt].ch[0] = t[cnt].ch[1] = 0;
    return cnt;
}
int copynode(int x)
{
    t[++cnt] = t[x];
    return cnt;
}
void pushup(int rt) { t[rt].siz = t[t[rt].ch[0]].siz + t[t[rt].ch[1]].siz + 1; }
int merge(int x, int y)
{
    if (!x || !y) return x + y;
    if (t[x].data < t[y].data) 
    {
        int p = copynode(x);
        t[p].ch[1] = merge(t[p].ch[1], y);
        pushup(p);
        return p;
    }
    else 
    {
        int p = copynode(y);
        t[p].ch[0] = merge(x, t[p].ch[0]);
        pushup(p);
        return p;
    }
}
void split(int rt, int& x, int& y, int val)
{
    if (!rt) { x = y = 0; return; }
    int nw = copynode(rt);
    if (t[nw].val <= val) 
    {
        x = nw;
        split(t[x].ch[1], t[x].ch[1], y, val);
    }
    else 
    {
        y = nw;
        split(t[y].ch[0], x, t[y].ch[0], val);
    }
    pushup(nw);
}
void ins(int v, int x)
{
    int a, b;
    split(RT[v], a, b, x - 1);
    RT[v] = merge(merge(a, newnode(x)), b);
    return;
}
void del(int v, int x)
{
    int a, b, c;
    split(RT[v], a, b, x - 1);
    split(b, b, c, x);
    b = merge(t[b].ch[0], t[b].ch[1]);
    RT[v] = merge(merge(a, b), c);
    return;
}
int query_rank(int v, int x)
{
    int a, b;
    split(RT[v], a, b, x - 1);
    int tmp = t[a].siz + 1;
    RT[v] = merge(a, b);
    return tmp;
}
int query_kth(int v, int kth)
{
    int u = RT[v];
    while (kth)
    {
        if (kth <= t[t[u].ch[0]].siz) u = t[u].ch[0];
        else if (t[t[u].ch[0]].siz == kth - 1) return t[u].val;
        else kth -= t[t[u].ch[0]].siz + 1, u = t[u].ch[1];
    }
    return t[u].val;
}
int pre(int v, int x)
{
    int a, b;
    split(RT[v], a, b, x - 1);
    if (!a) return -inf;
    int tmp = query_kth(a, t[a].siz);
    RT[v] = merge(a, b);
    return tmp;
}
int suf(int v, int x)
{
    int a, b;
    split(RT[v], a, b, x);
    if (!b) return inf;
    int tmp = query_kth(b, 1);
    RT[v] = merge(a, b);
    return tmp;
}
int main()
{
    std::ios::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0);
    
    cin >> n;
    while (n--)
    {
        int opt, v, x;
        cin >> v >> opt;
        RT[++tot] =  RT[v];
        switch(opt)
        {
            case 1:
                cin >> x,
                ins(tot, x);
                break;
            case 2:
                cin >> x,
                del(tot, x);
                break;
            case 3:
                cin >> x,
                cout << query_rank(tot, x) << "\n";
                break;
            case 4:
                cin >> x,
                cout << query_kth(tot, x) << "\n";
                break;
            case 5:
                cin >> x,
                cout << pre(tot, x) << "\n";
                break;
            default:
                cin >> x,
                cout << suf(tot, x) << "\n";
                break;
        }
        // for (int i = 1; i <= n; i++) cout << query_kth(tot, i) << " ";
        // cout << "\n";
    }
    return 0;
}

已知是 presuf 的问题。不过这样查询为什么不对呢?

到底是怎么会是呢?/yiw

2025/5/22 16:41
加载中...