-
\(\text{CF641E Little Artem and Time Machine}\)
- 算法:cdq分治
题目:
给你一个带时间戳的可重集,进行 \(n\) 次操作:
-
在 \(t\) 时刻插入一个 \(x\)。
-
在 \(t\) 时刻删除一个 \(x\)。
-
询问在 \(t\) 时刻有几个 \(x\)。
操作按照给的顺序进行。
操作形如 q t x
,q
表示操作的类型。
\(1\leq n\leq 10^5\),\(1\leq t,x\leq 10^9\)。
题解:
首先一个显然的三维偏序:操作顺序、时间戳、\(x\) 值。
然后第一维操作顺序本来就有序,所以不去动。
考虑 cdq 分治,左区间对右区间的影响。
假设 \(i\) 在左区间, \(j\) 在右区间,\(i\) 对 \(j\) 产生贡献当且仅当
\[t_{i}<t_{j},x_{i}=x_j \]那么对于 \(x\) 考虑维护一个桶即可。
记得离散化 \(x\)。
由于连树状数组的维护都不需要,所以必须通过归并排序的写法来代替 sort
,时间复杂度还是能保证 \(O(n\log n)\)。