做题记录 25.8.4

\(\textcolor{purple}\odot\) CF1623E Middle Duplication

对于点 \(u\),若左儿子存在且左儿子复制,则 \(u\) 复制;若 \(s_u\) 小于 中序遍历中下一个与 \(s_u\) 不同的字符,且复制 \(u\) 后顺带需要复制的节点数量(它的一部分祖先,若 \(u\) 复制则这些祖先复制)不超过 \(k\),则 \(u\) 复制;若 \(u\) 复制且存在右儿子,则递归考虑右儿子是否复制

直接模拟即可,时间复杂度 \(O(n)\)

代码

参考

\(\textcolor{purple}\odot\) CF1620G Subsequences Galore

\(a_{i,j}\)\(s_i\) 中第 \(j\) 个字母的出现次数

\(Ss(s_i)\) 表示 \(s_i\) 的子序列集合,显然 \(|Ss(s_i)|=\prod_j (a_{i,j}+1)\)

对于所有 \(S\subseteq U=\{1,2,\cdots,m\}\),要求出 \(f(S)=|\bigcup_{u\in S}Ss(s_u) |\)

\[\begin{aligned} f(S)&=\left|\bigcup_{u\in S}Ss(s_u)\right|\\ &=\left|\sum_{T\subseteq S}(-1)^{|T|-1} \left|\bigcap_{u\in T}Ss(s_u)\right|\right|\\ &=\left|\sum_{T\subseteq S}(-1)^{|T|-1} \prod_j \left(\min_{u\in T}a_{u,j}+1\right)\right|\\ \end{aligned} \]

对于每个 \(S\subseteq U\) 求出 \((-1)^{|S|-1} \prod_j \left(\min_{u\in S}a_{u,j}+1\right)\),对其 \(\text{FWT}\) 即可求出答案

时间复杂度 \(O(\sum |s_i|+|\sum|2^n+n2^n )\),其中 \(|\sum|\) 为字符集大小

代码

[2025“钉耙编程”中国大学生算法设计暑期联赛(6) 1001] cats 学乘法

存在 \(0\) 时显然答案为 \(0\) 的数量(每个 \(0\) 操作一次,容易配为正数),否则若乘积已经为整数则答案为 \(0\),否则为最小的绝对值加一

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

代码

[2025“钉耙编程”中国大学生算法设计暑期联赛(6) 1008] cats 的 max

\(k\ge m\) 时显然可以选择 \(m\) 个最大值所在行,答案为 \(\sum_{j=1}^m \max_{i=1}^n a_{i,j}\)

否则令 \(fmx_s=\max_{i=1}^n \sum_{u\in s}a_{i,u}\),转化为选择不超过 \(k\)\(fmx_s\) 使得它们之间无交且总和最大,容易 \(dp\) 解决

时间复杂度 \(O(\sum (n2^m+k3^m))\)

代码

[2025“钉耙编程”中国大学生算法设计暑期联赛(6) 1011] 取模

\(cnt\)\(a\) 中不同值的数量

特判 \(cnt\le c\) 的情况

对于一个 \(k\),值域 \([0,m]\) 可根据 \(\lfloor\frac vk\rfloor\mid v\in[0,m]\) 划分为 \(\lfloor\frac mk\rfloor+1\)

显然每段内至多有 \(c\) 个数,因此数字数量的上限为 \(c(\lfloor\frac mk\rfloor+1)\),即 \(c(\lfloor\frac mk\rfloor+1)\le cnt\),可得 \(k\le \frac m{\left\lfloor\frac{cnt-1}c\right\rfloor}=O(\frac{mc}{cnt})\)

每个 \(k\) 容易 \(O(cnt)\) 验证,总时间复杂度 \(O(n+mc)\)

代码

[2025“钉耙编程”中国大学生算法设计暑期联赛(6) 1002] 隧道挖掘

先考虑 \(k_2\le k_1\) 的情况

考虑每个 \(a\),对于 \(a\ge k_1\) 的情况,显然只用操作 \(1\) 最优,操作次数为 \(\lceil\frac a{k_1}\rceil\),否则只能用操作 \(2\),要求 \(k_2\mid a\),操作次数为 \(\frac a{k_2}\)

枚举 \(k_1\),容易 \(O(m\ln m)\) 维护 \(\sum_{a\ge k1} \lceil\frac a{k_1}\rceil\),显然 \(k_2\mid \gcd_{a<k_1} a\),因此取 \(k_2=\gcd_{a<k_1} a\) 最优,容易维护 \(\sum_{a<k_1}a\)\(k_2\)

因此这部分时间复杂度为 \(O(m\ln m)\)

然后考虑 \(k_1\le k_2\) 的情况

\(a<k_1\) 时显然无法操作,因此 \(k_1\le \min a\),令 \(mn=\min a\)

\(a\ge k_1\) 时,操作次数为 \(\lfloor\frac a{k_2}\rfloor+\lceil\frac{a\bmod k_2}{k_1}\rceil\)

\(k_2\le mn\) 时,显然 \(k_1=k_2\) 最优,已经包含在 \(k_2\le k_1\) 的情况中,不再考虑,因此只需要考虑 \(k_2>mn\) 的情况,此时 \(k_1=mn\)

转化为维护 \(\sum_a (\lfloor\frac a{k_2}\rfloor+\lceil\frac{a\bmod k_2}{mn}\rceil)\)

\(\sum_a \lfloor\frac a{k_2}\rfloor\) 容易 \(O(m\ln m)\) 维护,对于 \(\sum_a \lceil\frac{a\bmod k_2}{mn}\rceil\),枚举每个区间 \([l,r]=[k\times mn+1, (k+1)\times mn)\mid k\in\mathbb N\),令 \(c_x\)\(=x\)\(a\) 的数量,则转化为求 \(\sum c_{l\sim l+mn-1}+2\sum c_{l+mn\sim l+2mn-1}+\cdots +\lfloor\frac{r-l}{mn}+1\rfloor \sum c_{l+\lfloor\frac{r-l}{mn}\rfloor mn \sim r}\),预处理 \(sm_l\) 表示 \([l,r]=[l,m]\) 时的答案,容易 \(O(1)\) 计算一个以上形式的和

总时间复杂度 \(O(\sum (n+m\ln m))\)

代码

posted @ 2025-08-05 07:40  Hstry  阅读(8)  评论(0)    收藏  举报