感觉莫队能不能卡过真的很玄学
查看原帖
感觉莫队能不能卡过真的很玄学
70304
Pecco楼主2020/9/8 13:18

我这个应该是O(1)转移了吧,然而用上快读快写甚至加上各种#pragma依然TLE。

int A[MAXN], ans[MAXQ], M[MAXN], l = 1, r = 0, bg = 0, ed = MAXN - 1, nxt[MAXN] = {ed}, pre[MAXN];
inline void add(int p)
{
    if (M[A[p]] == 1)
        nxt[pre[A[p]]] = nxt[A[p]], pre[nxt[A[p]]] = pre[A[p]];
    M[A[p]]++;
    if (M[A[p]] == 1)
        pre[A[p]] = bg, nxt[A[p]] = nxt[bg], pre[nxt[bg]] = A[p], nxt[bg] = A[p];
}
inline void del(int p)
{
    if (M[A[p]] == 1)
        nxt[pre[A[p]]] = nxt[A[p]], pre[nxt[A[p]]] = pre[A[p]];
    M[A[p]]--;
    if (M[A[p]] == 1)
        pre[A[p]] = bg, nxt[A[p]] = nxt[bg], pre[nxt[bg]] = A[p], nxt[bg] = A[p];
}

但换种感觉很容易被卡的方法,反而卡着时限过了:

// 转移部分
queue<int> Qu;
inline void add(int p)
{
    if (M[A[p]] == 1)
        Del[A[p]] = 1;
    M[A[p]]++;
    if (M[A[p]] == 1)
    {
        Qu.push(A[p]);
        Del[A[p]] = 0;
    }
}
inline void del(int p)
{
    if (M[A[p]] == 1)
        Del[A[p]] = 1;
    M[A[p]]--;
    if (M[A[p]] == 1)
    {
        Qu.push(A[p]);
        Del[A[p]] = 0;
    }
}
// 储存答案处
while (!Qu.empty() && Del[Qu.front()])
    Qu.pop();
ans[Q[i].id] = (Qu.empty() ? 0 : Qu.front());
2020/9/8 13:18
加载中...