FHQ MLE是什么问题呀?
查看原帖
FHQ MLE是什么问题呀?
817044
cjwdyzxfblzs楼主2023/4/16 16:48

aa

#include <bits/stdc++.h>

using namespace std;

#define int long long

const int N = 1e6;
mt19937 rnd(233);

int read(){
	register int x=0;
	register bool f=0;
	register char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=(x<<3)+(x<<1)+c-48;
		c=getchar();
	}
	return f?-x:x;
}

struct FHQ
{   
    int l, r;
    int key, val;
    int sizes;
}tr[N];
int root, idx;
int x, y, z;

int get_node(int key)
{
    tr[ ++ idx].key = key;
    tr[idx].val = rnd();
    tr[idx].sizes = 1;
    return idx;
}
void push_up(int u)
{
    tr[u].sizes = tr[tr[u].l].sizes + tr[tr[u].r].sizes + 1;
    return;
}
void split(int p, int key, int &x, int &y)
{
    if (!p)
    {
        x = y = 0;
        return;
    }
    else
    {
        if (tr[p].key <= key)
        {
            x = p;
            split(tr[p].r, key, tr[p].r, y);
        }
        else
        {
            y = p;
            split(tr[p].l, key, x, tr[p].l);
        }
        push_up(p);
    }
    return;
}
int merge(int x, int y)
{
    if (!x || !y) return x + y;
    if (tr[x].val <= tr[y].val)
    {
        tr[x].r = merge(tr[x].r, y);
        push_up(x);
        return x;
    }
    else 
    {
        tr[y].l = merge(x, tr[y].l);
        push_up(y);
        return y;
    }
}
void insert(int key)
{
    split(root, key, x, y);
    root = merge(merge(x, get_node(key)), y);
    return;
}
void del(int key)
{
    split(root, key, x, z);
    split(root, key - 1, x, y);
    y = merge(tr[y].l, tr[y].r);
    root = merge(merge(x, y), z);
    return;
}
int get_rank(int key)
{
    split(root, key - 1, x, y);
    key = tr[x].sizes + 1;
    root = merge(x, y);
    return key;
}
int get_key(int rank)
{
    int p = root;
    while (p)
    {
        if (tr[tr[p].l].sizes + 1 == rank)
            break;
        else if (tr[tr[p].l].sizes >= rank)
            p = tr[p].l;
        else
        {
            rank -= tr[tr[p].l].sizes + 1;
            p = tr[p].r;
        }
    }
    return tr[p].key;
}
int get_pre(int key)
{
    split(root, key - 1, x, y);
    int p = x;
    while (tr[p].r) { p = tr[p].r;}
    key = tr[p].key;
    root = merge(x, y);
    return key;
}
int get_next(int key)
{
    split(root, key, x, y);
    int p = y;
    while (tr[p].l) { p = tr[p].l;}
    key = tr[p].key;
    root = merge(x, y);
    return key;
}

int n, m;
int last;
int ans;

signed main()
{
    n = read(), m = read();
    for (register int i = 1; i <= n; i ++ )
    {
        int a;
        a = read();
        insert(a);
    }
    for (register int i = 1; i <= m; i ++ )
    {
        int opt, x;
        opt = read(), x = read();
        if (opt == 1) insert(x ^ last);
        if (opt == 2) del(x ^ last);
        if (opt == 3) { last = get_rank(x ^ last); ans = ans ^ last;}
        if (opt == 4) { last = get_key(x ^ last); ans = ans ^ last;}
        if (opt == 5) { last = get_pre(x ^ last); ans = ans ^ last;}
        if (opt == 6) { last = get_next(x ^ last); ans = ans ^ last;}
    }
    cout << ans << "\n";

    return 0;
}
2023/4/16 16:48
加载中...