我这个应该是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());