做题记录 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
该过程可以用图表示
倒序扫描 \(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\),则可得
转化为
显然任意一个数位和不超过 \(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\) 小,转移为
若 \(p_i\) 向左移动,则 \(p_1\sim p_{i-1}\) 中剩下的最大值必须大于 \(p_i\),转移为
若 \(p_i\) 向右移动,则 \(p_1\sim p_{i-1}\) 中剩下的最大值必须小于 \(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)\)

浙公网安备 33010602011771号