做题记录 25.1.29

\(\textcolor{purple}\odot\) UVA1205 Color a Tree

假设当前除根外点权最大的节点为 \(u\),可证最优策略一定是在 \(fa_u\) 染色后立即染 \(u\)

因此考虑将两者合并为一个点,并计算出该操作对最终答案的贡献

定义块为原树的一个极大联通子集,满足当前为止其中的点都合并为一个点,用块中深度最小的点代表这个块

\(sz_u\) 表示当前 \(u\) 所在块中点的数量,\(sm_u\) 表示当前 \(u\) 所在块中点权之和

若要合并 \(u\)\(fa_u\),则对于每个子树 \(u\) 中的点,其在合并后的染色时间为合并前的染色时间减去 \(sz_{fa_u}\),因此答案累加 \(sz_{fa_u}\times sm_u\)

然后令 \(fa_u\)\(sz\)\(sm\) 分别加上 \(u\)\(sz\)\(sm\)

可用并查集维护每个点当前为止树上的父亲所在块

每次合并需要求出点权最大的点,实际上是权值最大的块

可以证明,块的权值取块内所有点的权值的平均数时,在以上各种操作下等效于点权

可以用堆维护每个块

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

代码

参考

同题

\(\textcolor{purple}\odot\) SP3912 MTREECOL - Color a tree \(\quad\) 代码

\(\textcolor{purple}\odot\) CF1776I Spinach Pizza

若每次删去面积最小的一个三角形,则可证选出的三角形序列面积单调不降

\(n\) 为奇数,则选择后手,否则选择先手,这样选出面积总和一定不超过一半

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

代码

参考

\(\textcolor{purple}\odot\) CF414C Mashmokh and Reverse Operation

\(a\) 数组进行归并排序(每次划分都要分为等长区间),令 \(cnt_{0,j}\) 表示 \(a\) 中长为 \(2^j\) 的区间中左子区间对右子区间的逆序对数量,\(cnt_{1,j}\) 表示右子区间对左子区间的逆序对数量,两者容易 \(O(n2^n)\) 求出

每次操作 \(p\) 相当于交换 \(cnt_{0,0\sim p}\)\(cnt_{1,0\sim p}\),交换后答案为 \(\sum_i cnt_{0,i}\)

总时间复杂度 \(O(n2^n+qn)\),可优化到 \(O(n2^n+q\log n)\) 但没有必要

代码

\(\textcolor{purple}\odot\) CF1120D Power Tree

将所有叶子按 \(dfn\) 排序,则每个节点对应一段区间,设叶子数为 \(c\)

转化为给定 \(n\) 个区间,每个区间有权值,选择权值和最小的子集,使得对于任意长为 \(c\) 的数组,都能通过选出的区间加减调整为 \(0\),求所有可能的子集的并

考虑将目标数组差分,则区间 \([l,r]\)\(v\) 等价于差分数字把 \(l\) 处的 \(v\) 移到 \(r+1\) 处,若 \(v\) 为负数则相当于反向移动,最终要全部移到 \(c+1\)

显然只要 \(c+1\) 个点联通即可

转化为有 \(n\) 条带权无向边(每个 \([l,r]\) 对应 \(l-(r+1)\),边权为区间的权值,即原树的点权),选出权值之和最小的一个子集,使得所有点联通,求合法方案之并

即给定 \(c+1\) 个点,求最小生成树之并

\(kruskal\) 把边权相同的边一起判断,再统一合并联通块即可

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

代码

posted @ 2025-01-30 07:37  Hstry  阅读(9)  评论(0)    收藏  举报