数据结构选做

  • \(\texttt{CF319E Ping-Pong}\)

    交叉的线段之间的边是双向边,可以用并查集维护。

    由于线段长度严格单调递增,只会出现后面的线段包含前面的线段的情况,因此直接用线段树去连边,并查集的正确性可以保证。

    对于包含的线段,由于 \(a\in b, b\in c \longrightarrow a\in c\) ,这种单向边最多只走一条,直接最后 \(check\) 一下即可。

    时间复杂度 \(\mathrm{O(n \alpha n\log n)}\) 。

    \(\texttt{ac记录}\)

  • \(\texttt{CF526F Pudding Monsters}\)

    由于每行每列只有一个点,可以将所有的 \((x,y)\) 映射成一个排列 \(p[x]=y\) ,那么一个大小为 \(k\) 的合法子矩阵满足:

    \[\max - \min + 1 = k \]

    考虑计算每个 \(r\) 的贡献,则合法的 \(l\) 满足 \(\max - \min + l = r\),由于 \([r,r]\) 必然合法,并且 \(\max - \min + l \ge r\),则有贡献的 \(l\) 满足

    \[\max - \min + l = \min\limits_{i=1}^{r}(\max - \min + i) \]

    用线段树维护区间最小值的个数即可,时间复杂度 \(\mathrm{O(n\log n)}\) 。

    \(\texttt{ac记录}\)

  • \(\texttt{CF453E Little Pony and Lord Tirek}\)

    将每个位置最近一次被查询的时间记作该位置的颜色,则每次查询最多只会使得序列颜色段数 \(+2\),并且每查询一段就会使整个序列的颜色段数 \(-1\),均摊下来查询的颜色段数是 \(O(1)\) 的,可以直接暴力。

    考虑一个颜色段怎么做,对于每只

上一篇:[LeetCode 2000] 反转单词前缀


下一篇:[luogu4156]论战捆竹竿