做题记录 25.6.4
\(\textcolor{purple}\odot\) CF1795G Removal Sequences
考虑先求出一种合法的移除序列,容易通过拓扑排序 \(O(n+m)\) 求出
对于原图中的 \(u-v\),若移除序列中 \(u\) 在前则定向为 \(u\to v\),否则定向为 \(v\to u\)(可在排序过程中顺便求出)
若得到的图中 \(u\) 和 \(v\) 之间可达,则点对 \((u,v)\) 不合法
设可达点对数量为 \(S\),则答案为 \(\binom n2-(S-n)\)(\(n\) 是因为可达点对包括形如 \(u\to u\) 的)
分块用 bitset 求出 \(S\) 即可
时间复杂度 \(O(\frac {n^2}\omega)\)
\(\textcolor{purple}\odot\) CF1795F Blocking Chips
显然具有单调性,因此二分答案,得到每个点需要移动的步数,转化为判定
令 \(ln_u\) 为 \(u\) 处的人需要移动的步数,若 \(u\) 处没有人则 \(ln_u=-1\)
\(\text{dfs}\) 过程中,令 \(dep_u\) 为从 \(u\) 出发向子树中行走,不经过已覆盖点的最大步数,\(dep_u=\max_{v\in son(u),ln_v=-1} dep_v+1\)
若 \(dep_u\ge ln_u\),则当前点合法
否则需要向上走,若 \(u\) 为根或 \(ln_{fa_u}\ne -1\) 则当前点不合法
否则令 \(ln_{fa_u}\gets ln_u-1\),当前点暂时合法
时间复杂度 \(O(\sum n\log n)\)
\(\textcolor{purple}\odot\) CF1794E Labeling the Tree with Distances
在 \(\text{dfs}\) 过程中用线段树维护当前点到所有点的距离,每次移动一条边时对线段树的修改相当于 \(O(1)\) 个区间加
令可重集 \(S=\{a\}\),令可重集 \(D=\{dis(u,i)\mid 1\le i\le n\}\),则 \(u\) 合法当且仅当 \(\exists u\in D,S\cup \{u\}=D\)
由于 \(S\cup \{u\}=D\) 的必要条件为 \(\sum S+u=\sum D\),而 \(\sum S\) 和 \(\sum D\) 容易计算,因此 \(u\) 是确定的
令可重集 \(S\) 的哈希值为 \(\sum_{u\in S}{base}^u\bmod mod\),容易维护加减的影响
时间复杂度 \(O(n\log^2 n)\)
\(\textcolor{purple}\odot\) CF1793E Velepin and Marketing
等价于分为 \(k\) 组,对于一组 \(S\) 贡献为 \(\sum_{i\in S}[a_i\le |S|]\)
将 \(a\) 从小到大排序
产生贡献的是 \(a\) 的一段前缀一定不劣,若不是前缀则换为等长的前缀并按值大小依次替换答案一定不减
每个组包含这段前缀的一个区间一定不劣,若两个组产生贡献的部分相交,设两组中产生贡献的集合为 \(s_1,s_2\),假定 \(|s_1|\le |s_2|\),则取 \(s_1\cup s_2\) 中的前 \(|s_1|\) 小作为 \(s_1'\),剩余作为 \(s_2'\),显然这样调整两个集合中的数仍然都产生贡献
设产生贡献的为 \(a_{1\sim x}\),则可以认为每个组包含 \([1,x]\) 的一个子区间和 \((x,n]\) 的一个子区间(显然不产生贡献的 \(a\) 可以任意重排),对于组 \(S\),令 \(L(S)\) 为前者,\(R(S)\) 为后者
至多一个 \(S\) 使得 \(L(S)\) 和 \(R(S)\) 都非空一定不劣,设 \(S_1\) 和 \(S_2\) 均满足,则调整为 \((S_1\cup S_2)/\{\max(\max R(S_1),\max R(S_2))\}\) 和 \(\{\max(\max R(S_1),\max R(S_2))\}\) 答案不减
显然分组越多,贡献越小,因此考虑计算出 \(g_i\) 表示 \(a_{1\sim i}\) 产生贡献(即总贡献为 \(i\))时最多分组数量,由 \(g\) 容易得到答案
最优情况下,产生贡献的组成若干个完整的组和至多一个不完整的组,不产生贡献的一部分和产生贡献剩余的拼为一个组(且这个组大小等于组内产生贡献的最大 \(a_i\)),剩余每个不产生贡献的 \(a_i\) 自成一组
令 \(f_i\) 表示 \(a_{1\sim i}\) 产生贡献时完整的组的最大数量
显然 \(f_0=g_0=0\)
当 \(i<a_i\) 时,要使 \(i\) 产生贡献,必须选择 \(a_{1\sim i}\) 和之后的 \(a_i-i\) 个 \(a_\ast\) 拼出大小为 \(a_i\) 的一个组(即不完整组),因此 \(f_i=0\),\(g_i=n-a_i+1\)(剩余 \(n-a_i\) 个分别自成一组)
当 \(i\ge a_i\) 时,要使 \(i\) 产生贡献,选择 \(a_{i-a_i+1\sim i}\) 作为一组最优,此时 \(f_i=f_{i-a_i}+1\),\(g_i=f_i+n-i\)(除了 \(a_{1\sim i}\),剩余 \(n-i\) 个自成一组)
\(f\) 需要取前缀 \(\max\)
总时间复杂度 \(O(n\log n+q)\),使用桶排容易做到 \(O(n+q)\)
\(\textcolor{blue}\odot\) CF1792E Divisors and Table
暴力分解 \(m_1,m_2\) 后组合,求出 \(m\) 的因子,数量不超过 \(2\times10^6\)
将因子排序后,对于 \(d\) 要找到最小的 \(x\) 满足 \(x\mid d,1\le x\le n,1\le \frac dx\le n\),即 \(\lceil\frac dn\rceil\le x\le n\),二分找到第一个 \(\ge \lceil\frac dn\rceil\) 的,然后暴力向后找,时间复杂度未知但可过
\(\textcolor{purple}\odot\) CF1792F1 Graph Coloring (easy version)
假设删去蓝色的边,则一张图合法当且仅当对于任意点的大小大于 \(1\) 的子集,其导出子图连通和其导出子图的补图连通恰好有一个成立,特别地完全图和无边的图不合法(最终答案减 \(2\) 即可忽略这一限制)
整张图要么是连通的,要么补图是连通的,令 \(f_i\) 表示 \(i\) 个点的图原图连通的方案数,则最终答案为 \(2f_n-2\),边界条件为 \(f_1=1\)
转移时枚举补图中 \(i\) 所在连通块大小 \(j\),当 \(j<i-1\) 时剩余部分方案数为 \(2f_{i-j}\)(连通或补图连通),这 \(j\) 个点方案数为 \(f_j\)(补图连通),选择点的方案数为 \(\binom{i-1}{j-1}\),两部分之间的边必须都连上以保证整张图连通
当 \(j=i-1\) 时不需要乘以 \(2\)
转移方程为
时间复杂度 \(O(n^2)\)
经过卡常可过 \(\text{hard version}\)

浙公网安备 33010602011771号