cf记录

cf2107D

\(Question:\)给定一个节点为\(n(1 \leq n \leq 2e5)\)的树,定义三元组\((d,u,v)\)为从点\(u\)到点\(v\)的路径长度\(d\) ,每次选择一个三元组删除从点\(u\)到点\(v\)的路径上的点及相关的边,并将其从右端加入序列\(A\),要求使序列A的字典序最大。

\(Apparent:\)始终选树的直径删除,维护以每个点为lca的直径\(f[i]\)。

\(Attention:\)每次删除后, 需更新所有祖先节点\(u\)的\(f[u]\),可以暴力更新,因为每次更新的点数一定小于等于此次删除的直径长度,所有直径长度和为\(n\),所以暴力更新总复杂度为\(O(n \log n)\)。

cf2042E

\(Question:\)给定一棵点数为\(2n(1 \leq n \leq 2e5)\)的树,每个点\(i\)有颜色\(a_i(1 \leq a_i \leq n)\),保证每种颜色出现\(2\)次, 要求选定一个联通点集满足:

  • 每种颜色至少 出现\(1\)次.
  • 按编号降序排序后,字典序最小.

\(Apparent:\)考虑不选 哪些点,降序排序后,能删则删,如何\(check\)?任选一点为根,动态维护每个点子树内外是否存在不可删点,问题转化为复杂数据结构,代码难度较高。

\(Attention:\)

经典刻画:一个必选根的联通块可由原树删去若干子树得到.

考虑选两个颜色相同 的点为根各跑一次,此时\(check\)不需要考虑子树外的点:

  • 两个颜色相同的点的\(LCA\)及其祖先不可删.
  • 每删去一个点,其子树内的点均删去,对于已删去的点,其对应颜色的另一个点及其祖先不可删.

总时间复杂度:\(O(n \log n)\)

提交记录:code for cf2042E

cf2064E

\(Question:\)给定一个排列p和一个序列c,长度均为\(n\),以此描述一个\(n \times n\)方格图,符合以下规则:

  • \(\forall \;1 \leq i \leq n 且1\leq j \leq p_i\),存在一个颜色为\(c_i\)的方格.
  • 方格会竖直下落,直到下方存在另一个方格.

计数存在多少个\(p'\)形成的方格图与\(p\)相同,对\(998244353\)取模.

\(Apparent:\)考虑对原排列\(p\)交换元素,\(p_i\)与\(p_j(i < j)\)可交换当且仅当\(i,j\)满足以下条件:

  • \(c_i = c_j\).
  • \(max_{k=i+1}^{j-1}p_k*[c_k \neq c_i] < min(p_i,p_j)\)

然后?然后就不会了......

\(Attention:\)考虑排列\(p\)中的最小数为\(p_i\),其只能与所属同色联通块中的元素交换,令\(p_i\)可交换的集合为\(S_i\),满足\(\forall j \neq i ,S_i \supseteq S_j 或 S_i \cap S_j = \varnothing\),可以乘法原理,将答案乘上\(p_i\)所属同色连通块大小,并删除\(p_i\),联通块大小减一,重复以上步骤排列为空,以上操作可以通过并查集加链表实现。

总时间复杂度:\(O(n \alpha(n))\)

提交记录:code for cf2064E