【做题记录】CF641E Little Artem and Time Machine

  • \(\text{CF641E Little Artem and Time Machine}\)

    • 算法:cdq分治

题目:

给你一个带时间戳的可重集,进行 \(n\) 次操作:

  1. 在 \(t\) 时刻插入一个 \(x\)。

  2. 在 \(t\) 时刻删除一个 \(x\)。

  3. 询问在 \(t\) 时刻有几个 \(x\)。

操作按照给的顺序进行。

操作形如 q t xq 表示操作的类型。

\(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)\)。

上一篇:CSAPP阅读笔记(一):大纲


下一篇:CSAPP Bomblab 学习记录