做题记录 25.2.6

\(\textcolor{purple}\odot\) [AGC031C] Differ by 1 Bit

\(p_i\)\(p_{i+1}\) 相当于某一位异或了 \(1\),从 \(p_0\)\(p_{2^n-1}\) 一共进行了 \(2^n-1\) 次,为奇数,因此 \(p_0\oplus p_{2^n-1}\)\(\operatorname{popcount}\) 必须为奇数,即 \(A\oplus B\) 必须为奇数,否则一定无解

接下来通过构造证明满足该要求的一定有解

\(sol(n,A,B,G)\) 表示在只改变子集 \(G\) 中的位的情况下,将 \(A\) 变为 \(B\),并且 \(|G|=n\) 的一种方案,则题目要求的答案为 \(sol(n,A,B,2^n-1)\)

\(n=1\) 时,构造 \(p_0=A,p_1=B\)

\(n\ne 1\) 时,考虑分治为两个 \(sol(n-1,\ast,\ast,\ast)\)

\(T\)\(A\oplus B\) 的最高位,显然 \(T\in G\)

若能找到一个合适的 \(t\),则能划分为 \(sol(n-1,A,A\oplus t,G/\{B\})\)\(sol(n-1,A\oplus t\oplus 2^T,B,G/\{B\})\)

需要选择满足 \(\operatorname{popcount}(t)\) 为奇数且 \(t\subseteq G/\{B\}\)

显然在处理过程中,对于每个 \(sol(n,A,B,G)\),都保证了 \(|G|=n\)\(A\oplus B\subseteq G\),且 \(\operatorname{popcount}(A\oplus B)\) 为奇数

可证该过程满足要求

代码

参考

\(\textcolor{purple}\odot\) [AGC022E] Median Replace

先考虑如何判定给定序列是否合法

考虑维护一个栈,初始为空,从左到右尝试将字符加入栈

若加入字符为 \(0\)

  • 当栈顶有连续两个 \(0\) 时,直接弹出一个 \(0\),即把三个 \(0\) 缩为一个 \(0\),一定不劣
  • 否则有可能之后可以把栈中的 \(0\) 消去,因此暂时将这个 \(0\) 压入栈

若加入字符为 \(1\)

  • 当栈顶为 \(0\) 时,则将栈顶弹出,因为 \(01\) 和任意数(\(0/1\))取中位数还是那个数,相当于可以忽略 \(01\)
  • 当栈顶有连续两个 \(1\) 时,忽略当前要加入的 \(1\),因为超过三个连续 \(1\) 最后都等价于两个
  • 否则将当前的 \(1\) 加入栈顶

由该过程可得栈中 \(1\)\(0\) 以下且两者数量都不超过 \(2\),因此可以把栈的状态压为两位 \(0\sim 2\),分别表示 \(0\)\(1\) 的数量

\(dp_{i,s}\) 表示 \(1\sim i\),栈的状态为 \(s\) 的方案数,然后按上述过程模拟即可

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

代码

\(\textcolor{purple}\odot\) [AGC007F] Shik and Copying String

该过程可以用图表示

\[\def\R{\textcolor{red}}\def\B{\textcolor{blue}}\def\G{\textcolor{grey}} \begin{matrix} S_0: & \R a & \textcolor{grey}b & \B c & \G d & \G e\\ S_1: & \R a & \G a & \B c & \B c & \G c\\ S_2(T): & \R a & \R a & \R a & \B c & \B c\\ \end{matrix} \]

倒序扫描 \(T\)

对于 \(T\) 中连续同色段,只需要关注段中第一个位置的情况(之后的部分显然可以在最后一次操作时覆盖上),假设该位置为 \(i\),则其由 \(S\)\([1,i]\) 内最后一个与之同色的位置 移动过来最优,该位置容易双指针均摊 \(O(1)\) 求出

维护一个动态长度数组 \(a\)\(a_i\) 表示当前处理的段的第一个元素在 \(S_i\) 中的位置,则答案为所有时刻中其长度的最大值

每次要在其头部加入一个值,尾部删去若干值,并全局加

可以用队列维护

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

代码

\(\textcolor{purple}\odot\) [AGC011E] Increasing Numbers

显然任意一个上升数都可以写为不超过 \(9\) 个形如 \(\frac{10^t-1}9\)(即 \(\underbrace{111\cdots 11}_{t}\))的数

令原数为 \(N\),其拆为 \(k\) 个上升数,第 \(i\) 个上升数表示为 \(\sum_{j=1}^9\dfrac{10^{a_{i,j}}-1}9\),则可得

\[N=\sum_{i=1}^k\sum_{j=1}^9\frac{10^{a_{i,j}}-1}9 \]

转化为

\[9N+9k=\sum_{i=1}^k \sum_{j=1}^9 10^{a_{i,j}} \]

显然任意一个数位和不超过 \(9k\) 的数都能表示为右侧的形式

因此 \(k\) 合法当且仅当 \(9N+9k\) 的数位和不超过 \(9k\)

由于 \(k\) 要最小,因此暴力枚举 \(k\) 并维护 \(9N+9k\) 的数位和(先令 \(N\gets N\times 9\),然后每次 \(N\gets N+9\),仅修改需要修改的位,同时维护数位和)并判断即可

显然最终答案不超过 \(\log_{10} N+O(1)\),且枚举每个 \(k\) 为均摊 \(O(1)\)

因此总时间复杂度 \(O(n)\)(此处 \(n\) 表示 \(10\) 进制下 \(N\) 的长度)

代码

参考

\(\textcolor{purple}\odot\) [AGC018D] Tree and Hamilton Path

先考虑哈密顿回路

此时答案为 \(\sum_{i=2}^n 2w(i,fa_i)\min(sz_i,n-sz_i)\),其中 \(w(u,v)\) 表示 \(u\)\(v\) 之间的边权,\(sz_i\) 表示子树 \(i\) 内的点数

具体构造为 令根为重心(若两个重心则将两者之间的边视为重心),从某个叶子开始,每次找到一个与之不在同一子树(根的子树)的叶子移过去,直到只剩重心为止,并删除原来的叶子,显然在删到只剩重心之前一定可以找到这样的点

然后考虑哈密顿路的情况

显然的想法是在哈密顿回路上删去最短边

可以 证明 这样得到的哈密顿路一定最优

考虑如何找到哈密顿回路上的最短边

显然按上述构造得到的哈密顿回路每条边都经过重心(或双重心之间的边)

当有两个重心时,最后删除的一定为两个重心之间的边,而且其一定最短(因为其他的一定严格包含该边),因此此时最短边为重心之间的边

当只有一个重心时,最后删除的一定为重心到其某个儿子之间的边(因为 \(n\ge 2\),因此一定存在该点),此时最短边为重心到儿子之间的边中最短的一条(因为最后一个点可自由选择,因此无论选择哪个儿子,一定存在合法方案,而且哈密顿回路上其余任意边一定包含一条重心到其某个儿子的边,而这条边一定不短于选择的那条,即选出的一定为最短的)

直接计算即可,时间复杂度 \(O(n)\)

代码

\(\textcolor{purple}\odot\) [AGC032D] Rotation Sort

\(dp_{i,j}\) 表示 \(p_1\sim p_i\)\(>j\) 的值都向后移动的最小代价,则 \(dp_{0,0}=0\),答案为 \(\min_{i=0}^n dp_{n,i}\)

\(p_i\) 保持不动,则 \(p_1\sim p_{i-1}\) 中剩下的值必须比 \(p_i\) 小,转移为

\[dp_{i,p_i}\gets \min_{j=0}^{p_i-1}dp_{i-1,j} \]

\(p_i\) 向左移动,则 \(p_1\sim p_{i-1}\) 中剩下的最大值必须大于 \(p_i\),转移为

\[dp_{i,j}\gets b+dp_{i-1,j}\;(j>p_i) \]

\(p_i\) 向右移动,则 \(p_1\sim p_{i-1}\) 中剩下的最大值必须小于 \(p_i\),转移为

\[dp_{i,j}\gets a+dp_{i-1,j}\;(j<p_i) \]

时间复杂度 \(O(n^2)\),容易线段树优化到 \(O(n\log n)\)

代码

\(\textcolor{purple}\odot\) [AGC032E] Modulo Pairing

\(M>2\max_i a_i\),则最优策略显然为 \(a_i\) 匹配 \(a_{2n-i+1}\),以下称之为 \(a_{1\sim 2n}\) 的平凡匹配

否则,最终匹配中一部分为 \(a_x+a_y\),一部分为 \(a_x+a_y-M\),且可以证明,将 \(a_{1\sim 2n}\) 从小到大排序后,一定存在一种最优解,为 \(a\) 的一个前缀和剩余后缀分别平凡匹配

将数列 \(\{a_i\mid 1\le i\le 2n\}\) 和数列 \(\{a_i-m\mid 1\le i\le 2n\}\) 合并后从小到大排序,记排序后结果为 \(b_{1\sim 4n}\),则存在一种最优解,对应 \(b\) 中一个长为 \(2n\) 的区间(区间内平凡匹配,要求任意一对匹配之和 \(\ge 0\)\(<M\)

显然在满足任意一对匹配之和 \(\ge 0\) 的情况下,选择左端点最小的匹配最优,可证次情况下任意一对匹配 \(<M\)

考虑逐步扩展以得到合法区间,设当前扩展到的区间为 \([l,r]\),初始 \(l=2n+1\)\(r=2n\)(若再向左,则之后的扩展不满足任意匹配 \(\ge 0\)

每次扩展,先令 \(l\gets l-1\)\(r\gets r+1\)

若此时 \(a_l+a_r<0\),则令 \(l\gets l+1\)\(r\gets r+1\),这样原本(扩展之前)的每个数都匹配到一个更大的数(严格来说是不小于之前的),匹配一定合法

匹配到区间长度等于 \(2n\) 时停止,显然这样得到的一定为最靠左的

然后暴力模拟求出答案即可

时间复杂度 \(O(n\log n)\),瓶颈在于排序,若使用基排则可到 \(O(n)\)

代码

参考

\(\textcolor{purple}\odot\) [AGC033D] Complexity

比较直接的 \(dp\)\(dp_{i,j,k,l}\) 表示矩阵 \((i\sim j,k\sim l)\) 的凌乱度,这样时间复杂度为 \(O(n^2m^2(n+m))\) 的,无法接受

发现答案不超过 \(\lceil\log_2 n\rceil+\lceil\log_2 m\rceil\),因此将值和下标交换,令 \(dp_{v,l,r,u}\) 表示最大的 \(d\) 使得矩形 \((u\sim d,l\sim r)\) 凌乱度不超过 \(v\)

对于每组 \(l,r,u\),找到最大的 \(d\) 使得 \((u\sim d,l\sim r)\) 范围内的字符相同,则令 \(dp_{0,l,r,u}\gets d\),其为边界条件,可以二分,也可以在 \(dp_{l,r,u-1}\) 的基础上暴力枚举

答案显然为最小的 \(v\) 使得 \(dp_{1,m,1}=n\)

转移分为上下剖分和左右剖分

若上下剖分,则显然在 \(dp_{v-1,l,r,u}\)\(dp_{v-1,l,r,u}+1\) 之间剖开最优,因此 \(dp_{v,l,r,u}\gets dp_{v-1,l,r,dp_{v-1,l,r,u}}\)

若左右剖分,则转移为 \(dp_{v,l,r,u}\gets \min(dp_{v,l,p,u},dp_{v,p+1,r,u})\),直接做为 \(O(n^4\log n)\) 的无法接受,可以二分分界点(使得左右尽量接近)做到 \(O(n^3\log^2 n)\),也可以利用分界点的单调性做到 \(O(n^3\log n)\)

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

代码

posted @ 2025-02-07 07:01  Hstry  阅读(17)  评论(0)    收藏  举报