这个离谱的报错是啥啊?
  • 板块学术版
  • 楼主cjwdyzxfblzs
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/7/1 21:57
  • 上次更新2023/11/3 11:56:12
查看原帖
这个离谱的报错是啥啊?
817044
cjwdyzxfblzs楼主2023/7/1 21:57

a

这个是运行这个的代码

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
    while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
    return x*f;
}
const int N = 1e6;
// mt19937 rnd(233);
int n, m, q, cnt;
struct FHQ
{
    struct node
    {
        int ls, rs;
        int size, val, rand;
    } *tr;
    int root, L, R ,p;
    FHQ()
    {
        tr = new node[N]();
    }
    int clone(int val)
    {
        tr[ ++ cnt].val = val;
        tr[cnt].rs = tr[cnt].ls = 0;
        tr[cnt].size = 1;
        tr[cnt].rand = rand();
        return cnt;
    }
    void push_up(int u)
    {
        tr[u].size = tr[tr[u].ls].size + tr[tr[u].rs].size + 1;
    }
    void split(int u, int k, int &L, int &R)
    {
        if (!u) return L = R = 0, void();
        if (k <= tr[tr[u].ls].size)
        {
            R = u;
            split(tr[u].ls, k, L, tr[u].ls);
        }
        else 
        {
            L = u;
            split(tr[u].rs, k - tr[tr[u].ls].size - 1, tr[u].rs, R);
        }
        push_up(u);
    }
    void __split(int u, int x, int &L, int &R)
    {
        if (!u) return L = R = 0, void();
        if (tr[u].val <= x)
        {
            L = u;
            __split(tr[u].rs, x, tr[u].rs, R);
        }
        else 
        {
            R = u;
            __split(tr[u].ls, x, L, tr[u].ls);
        }
        push_up(u);
    }
    int merge(int x, int y)
    {
        if (!x || !y) return x + y;
        if (tr[x].rand < tr[y].rand)
        {
            tr[x].rs = merge(tr[x].rs, y);
            push_up(x);
            return x;
        }
        else 
        {
            tr[y].ls = merge(x, tr[y].ls);
            push_up(y);
            return y;
        }
    }
    int get_kth(int rank)
    {
        int p = root;
        while (p)
        {
            if (tr[tr[p].ls].size + 1 == rank)
                break;
            else if (tr[tr[p].ls].size >= rank)
                p = tr[p].ls;
            else 
            {
                rank -= tr[tr[p].ls].size + 1;
                p = tr[p].rs;
            }
        }
        return tr[p].val;
    }
    void insert(int val)
    {
        root = merge(root, clone(val));
    }
}HAN[N], LIE;
signed main()
{
   n = read(), m = read(), q = read();
    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= m - 1; j ++ )
        {
            HAN[i].insert((i - 1) * m + j);
        }
    for (int i = 1; i <= n; i ++ )
        LIE.insert(i * m);
    for (int i = 1; i <= q; i ++ )
    {
        int x = read(), y = read();
        HAN[x].split(HAN[x].root, y - 1, HAN[x].L, HAN[x].R);
        HAN[x].split(HAN[x].R, 1, HAN[x].p, HAN[x].R);
        cout << HAN[x].tr[HAN[x].p].val << endl;
        HAN[x].root = HAN[x].merge(HAN[x].L, HAN[x].R);
        LIE.split(LIE.root, x - 1, LIE.L, LIE.R);
        LIE.split(LIE.R, 1, LIE.p, LIE.R);
        HAN[x].root = HAN[x].merge(HAN[x].root, LIE.p);
        LIE.root = LIE.merge(LIE.L, LIE.merge(LIE.R, HAN[x].p));
    } 
    return 0;
}

2023/7/1 21:57
加载中...