做题记录 25.4.13

\(\textcolor{purple}\odot\) CF1917F Construct Tree

\(l\) 从小到大排序

\(l_{n-1}+l_n<d\) 则无解

若可以选出集合 \(S\subset l\),满足 \(l_n\in S\)\(\sum S=d\),则一定有解

构造方式为把 \(S\) 中的边连成一条链,其中 \(l_n\) 为链首,把剩余的边接在链的第二个点上,这个点向左有 \(l_n\),向右至少有 \(l_{n-1}\),而剩余边最大长度不超过 \(l_{n-1}\),接在这个点上一定不会影响直径,因此构造合法

这一判定容易背包实现,时间复杂度 \(O(\frac{nd}\omega)\)

若可以选出 \(S,T\subset l\)\(S\cap T=\mathbb \emptyset\)\(\sum S\ge l_n,\sum T\ge l_n\)\(\sum S+\sum T=d\),则一定有解

构造方式为把 \(S\cup T\) 中的边连成一条链,\(S\) 中的边在 \(T\) 中的边的左侧,剩余边连在 \(S\)\(T\) 之间的分界点上,构造合法性与上一种情况类似

判定容易 bitset 优化,时间复杂度 \(O(\frac{nd^2}\omega)\)

代码

参考

\(\textcolor{purple}\odot\) CF1917E Construct Matrix

显然 \(2\nmid k\) 时无解

\(4\mid k\) 时,显然可以用 \(2\times 2\) 的矩阵填充

\(4\nmid k\),即 \(k\equiv 2\pmod 4\) 时,分为若干区间:

  • \(k=2\) 时,显然只有 \(n=2\) 时合法
  • \(k=4\) 的情况已经被 \(4\mid k\) 包含
  • \(6\le k\le n^2-10\) 时,在左上角构造 \(\begin{matrix}1&1&0&0\\1&0&1&0\\0&1&1&0\\0&0&0&0\end{matrix}\),剩下用 \(2\times 2\) 的填充
  • \(k=n^2-8\) 的情况也被 \(4\mid k\) 包含
  • \(k=n^2-6\) 时,左上角为 \(\begin{matrix}0&0&1&1\\0&1&0&1\\1&0&0&1\\1&1&1&1\end{matrix}\),剩下全填 \(1\)
  • \(k=n^2-4\)\(4\mid k\) 包含
  • \(k=n^2-2\) 时,只有 \(n=2\) 时合法
  • \(k=n^2\)\(4\mid k\) 包含

时间复杂度 \(O(\sum n^2)\)

代码

参考

\(\textcolor{blue}\odot\) CF1917D Yet Another Inversions Problem

\(k\) 个位置视为一段,每段内的逆序对数都等于 \(q\) 的逆序对数量,乘以 \(n\) 即为段的总贡献,这部分容易树状数组做到 \(O(k\log k)\)

然后考虑段之间的贡献,令 \(Lg=\log_2(n)+O(1)\),可表示为

\[\begin{aligned} &\sum_{0\le i<j<n}\sum_{0\le s<k}\sum_{0\le t<k}[p_i\times2^s>p_j\times2^t]\\ =&\sum_{0\le i<j<n}\sum_{0\le t<k}\sum_{\max(0,t-Lg)\le s\le \min(k-1,t+Lg)}[p_i\times2^s>p_j\times2^t]+\sum_{0\le i<j<n}\sum_{0\le t<k}\sum_{t+Lg+1\le s<k}[p_i\times2^s>p_j\times2^t]\\ =&\sum_{o=-Lg}^{Lg} \sum_{0\le i<j<n}\sum_{0\le t<k}[0\le t+o<k][p_i\times2^o>p_j]+\sum_{0\le i<j<n}\sum_{0\le t<k}\sum_{t+Lg+1\le s<k}1\\ =&\sum_{o=-Lg}^{Lg} \sum_{0\le i<j<n}\sum_{\max(0,-o)\le t<\min(k,k-o)}[p_i\times2^o>p_j]+\binom n2\sum_{Lg\le t<k}t-Lg\\ =&\sum_{o=-Lg}^{Lg}(\min(k,k-o)-\max(0,-o)) \sum_{0\le j<n}\sum_{i=0}^{j-1}[p_i\ge \lfloor p_j\times2^{-o}\rfloor+1]+\binom n2\sum_{Lg\le t<k}t-Lg\\ \end{aligned} \]

后一部分容易 \(O(1)\) 计算,前一部分中的 \(\sum_{i=0}^{j-1}[p_i\ge \lfloor p_j\times2^{-o}\rfloor+1]\) 容易树状数组维护,时间复杂度 \(O(n\log^2 n)\)

总时间复杂度 \(O(\sum (n\log^2 n+k\log k))\)

代码

\(\textcolor{blue}\odot\) CF1916E Happy Life in University

先求出 \(\text{dfs}\)

枚举 \(\text{lca}\)\(u\),令此时的 \(c_{dfn_i}\) 为结点 \(i\)\(u\) 的链上的颜色数量,则 \(u\) 的最优解为可重集 \(\{\max c_{dfl_v\sim dfr_v}\mid v\in {son}(u)\}\) 中最大值和次大值之积,其中 \(dfl_v\)\(dfr_v\) 表示子树 \(v\) 内的最小最大 \(dfn\)

考虑如何维护 \(c\)

假设 \(\text{dfs}\) 到一个点时,\(c\) 中对应区间保存了相应的值,在回溯时得到父亲的区间对应的 \(c\)

假设目前回溯到 \(u\),则对于任意 \(v\) 满足 \(v\) 在子树 \(u\) 内且 \(u-v\) 的链上没有其它与 \(u\) 颜色相同的结点,使 \(c_v\) 加一

考虑在此之前进行一次 \(\text{dfs}\),每个点保存一个列表,表示这个点向下走能到达的第一个同色点,实现方式为对于每个点 \(u\),在 \(u\) 向上第一个与 \(u\) 同色的点的列表中插入 \(u\)

则对 \(c\) 的影响相当于 \([dfl_u,dfr_u]\) 加一,然后对于 \(u\) 的列表中的每个 \(v\),令 \([dfl_v,dfr_v]\) 减一

时间复杂度 \(O(\sum n\log n)\)

代码

参考

posted @ 2025-04-14 07:15  Hstry  阅读(2)  评论(0)    收藏  举报