【做题记录】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)\)

posted @ 2022-01-08 10:22  trsins  阅读(36)  评论(0)    收藏  举报