做题记录 25.4.16
\(\textcolor{blue}\odot\) CF2085F1 Serval and Colorful Array (Easy Version)
枚举区间的第 \(\lceil\frac k2\rceil\) 个位置,设为 \(p\)
则最优情况下需要在 \(p\) 及其左侧选择 \(\lceil\frac k2\rceil\) 个数,在 \(p\) 右侧选择 \(\lfloor\frac k2\rfloor\) 个数,移到 \([p-\lceil\frac k2\rceil+1,p+\lfloor\frac k2\rfloor]\) 中
假设都移到 \(p\),最终答案减去 \(\sum_{i=1}^k |i-\lceil\frac k2\rceil|\)
设数字 \(v\) 在 \(p\) 及其左侧第一个位置为 \(l_v\),在其右侧第一个位置为 \(r_v\),则相当于从 \(l_v\) 中选 \(\lceil\frac k2\rceil\) 个,从 \(r_v\) 中选 \(\lfloor\frac k2\rfloor\) 个,设选出的 \(k\) 个数构成的集合为 \(S\),则需要最小化 \(\sum_{u\in S}|p-u|\)
对于所有 \(p\) 总和取最小即为答案
发现可以去掉 \(l_v\) 中选 \(\lceil\frac k2\rceil\) 个 \(r_v\) 中选 \(\lfloor\frac k2\rfloor\) 个的限制,因为不满足这一限制的一定会被覆盖
因此对于每个 \(p\) 求出 \(\sum_{i=1}^k \min(p-l_i,r_i-p)\) 即可
时间复杂度 \(O(\sum nk)\)
\(\textcolor{blue}\odot\) CF2081D MST in Modulo Graph
显然可以把 \(p\) 去重,因为相同的 \(p\) 之间连边的代价为 \(0\),等价于缩为一个点
对于三个值 \(a,b,c\),若有 \(ka\le b<c<(k+1)a\;(k\in\mathbb N^+)\),则 \(a-b,b-c\) 的代价为 \(b-a+c-b\),\(a-b,a-c\) 的代价为 \(b-a+c-a\),显然前者更优,因此边 \(b-c\) 无用
因此对于每对 \((a,k)\),\(a\) 只需要连向 \([ka,(k+1)a)\) 中第一个位置即可
这样总边数为 \(O(\sum_{i=1}^n \frac1{p_i})=O(V\ln n)\) 的
使用 \(\text{Kruskal}\) 求最小生成树可做到 \(O(V\ln n\log (V\ln n))=O(V\ln n\log V)\)
总时间复杂度 \(O(\sum V\ln n\log V)\),空间复杂度 \(O(\max V\ln n)\),瓶颈在于排序
换为桶排可做到时间复杂度 \(O(V\ln n\alpha(n))\),空间复杂度 \(O(V\ln n)\),可过 P7789 [COCI 2016/2017 #6] Sirni \(\quad\) 代码
\(\textcolor{purple}\odot\) CF2081C Quaternary Matrix
令 \(r_i\) 表示第 \(i\) 行的异或和,\(c_i\) 表示第 \(i\) 列的异或和
则问题转化为每次操作 \((x,y,z)\) 使得 \(r_x\) 和 \(c_y\) 异或上 \(z\),用最小的操作次数使所有 \(r\) 和 \(c\) 都归 \(0\),并给出方案
令 \(R_i\) 表示 \(r\) 中值为 \(i\) 的位置,\(C_i\) 表示 \(c\) 中值为 \(i\) 的位置
则答案上限为 \(|R_1|+|R_2|+|R_3|+|C_1|+|C_2|+|C_3|\),即暴力实现
定义 \(G=(R,C)\) 为组满足:
- \(R\subseteq \{1,2,\cdots,n\},C\subseteq\{1,2,\cdots,m\}\)
- \(\bigoplus_{u\in R}r_u\oplus\bigoplus_{u\in C}c_u=0\)
- \(\forall {u\in R}(r_u\ne 0),\forall {u\in C}(c_u\ne 0)\)
- \(|R|>0,|C|>0\)
除了对 \(r\) 和 \(c\) 单点修改的操作外,剩余操作都可用若干组的并表示
定义组 \(G=(R,C)\) 的类型为 \(|R|+|C|\) 元组 \(Q\),\(Q_{0\sim |R|-1}\in\{R_1,R_2,R_3\}\) 分别表示 \(R\) 中元素所属的集合,\(Q_{|R|\sim |R|+|C|-1}\) 同理
定义组为 \(P_2\) 型的当且仅当其类型为 \((R_1,C_1)\),\((R_2,C_2)\),\((R_3,C_3)\) 之一
定义组为 \(P_3\) 型的当且仅当其类型为 \((R_1,R_2,C_3)\),\((R_1,R_3,C_2)\),\((R_2,R_3,C_1)\),\((R_1,C_2,C_3)\),\((R_2,C_1,C_3)\),\((R_3,C_1,C_2)\) 之一
定义组为 \(P_4\) 型的当且仅当其类型为 \((R_1,R_1,C_2,C_2)\),\((R_1,R_1,C_3,C_3)\),\((R_2,R_2,C_1,C_1)\),\((R_2,R_2,C_3,C_3)\),\((R_3,R_3,C_1,C_1)\),\((R_3,R_3,C_2,C_2)\) 之一
一个 \(P_2\) 型的组可以通过一次操作清空,一个 \(P_3\) 型的组可以通过两次操作清空,一个 \(P_4\) 型的组可以通过三次操作清空
因此每增加一个 \(P_2/P_3/P_4\) 型的组,答案都可在 \(|R_1|+|R_2|+|R_3|+|C_1|+|C_2|+|C_3|\) 的基础上减一
可证:
- 存在一种最优解使得其中不存在 \(P_2,P_3,P_4\) 之外的组
- 存在一种最优解使得其中所有 \(P_3\) 型的组类型都相同,所有 \(P_4\) 型的组都类型相同
- 存在一种最优解使得其中 \(P_4\) 型覆盖到的 \(R,C\) 为 \(P_3\) 型覆盖到 \(R,C\) 的子集
因此先尽量选出 \(P_2\) 型,接着尽量选择 \(P_3\) 型,然后尽量选择 \(P_4\) 型,最终用单点修改的方式处理剩余位置
时间复杂度 \(O(\sum nm)\)
\(\textcolor{blue}\odot\) CF2081B Balancing
定义位置 \(i\) 为下降位置当且仅当 \(a_i>a_{i+1}\)
定义区间 \([l,r]\) 为连续段当且仅当 \(\forall l\le i<r,a_i<a_{i+1}\) 且 \(l=1\lor a_{l-1}>a_l\) 且 \(r=n\lor a_r>a_{r+1}\)
令 \(d\) 为下降位置数量
当 \(d=0\) 时显然答案为 \(0\),\(d=1\) 时显然答案为 \(1\)(选择一个连续段抬升或下降)
显然一次操作至多令 \(d\) 减小 \(2\),且 \(d\ge 3\) 时可以做到这一点(连续四段 \([a,b),[b,c),[c,d),[d,e)\),\([b,c)\) 抬升至 \(b\) 位置高于 \(b-1\) 位置,\([c,d)\) 下降至 \(d-1\) 位置低于 \(d\) 位置)
因此当 \(d\ge 3\) 且 \(2\nmid d\) 时,答案为 \(\lceil\frac d2\rceil\)
当 \(2\mid d\) 时,可以通过 \(\frac d2-1\) 次操作令 \(d=2\)
令 \(l\) 为第一个下降位置,\(r\) 为最后一个下降位置加一
\(d=2\) 且 \(r-l>a_r-a_l\) 时需要两次,\(r-l\le a_r-a_l\) 时需要一次
因此 \(2\mid d\) 时,答案为 \(\frac d2+[r-l>a_r-a_l]\)
时间复杂度 \(O(\sum n)\)
\(\textcolor{blue}\odot\) CF2077C Binary Subsequence Value Sum
对于二进制串 \(v_{1\sim l}\),令 \(s_i\) 为 \(v_{1\sim i}\) 中 \(0\) 的数量,则 \(v\) 的分数为
令 \(w_i=i-2s_i\),则分数为
当 \(w_i=\lfloor\frac{w_n}2\rfloor\) 时 \(w_i(w_n-w_i)\) 取到最大值 \(\lfloor\frac{w_n}2\rfloor\lceil\frac{w_n}2\rceil\),由于 \(w_i-w_{i-1}\in\{1,-1\}\),\(w_0=1\),显然一定存在一个 \(w_i\) 取到 \(\lfloor\frac{w_n}2\rfloor\)
即串 \(v\) 的分数为 \(\lfloor\frac{w_n}2\rfloor\lceil\frac{w_n}2\rceil=\frac{w_n^2-(w_n\bmod 2)}4\)
然后考虑求出字符串 \(s\) 所有子序列的分数和
分别计算 \(\sum_{v\subset s} w_n^2\) 和 \(\sum_{v\subset s} (w_n\bmod 2)\)
后者只和 \(s\) 的长度 \(n\) 有关,为 \(\sum_{l=0}^n (l\bmod 2)\binom nl\),容易 \(O(n)\) 预处理
前者考虑用矩阵描述,令状态为 \(\begin{bmatrix}a\\b\\c\end{bmatrix}\),其中 \(a\) 为目前为止 \(w_n^2\) 之和,\(b\) 为 \(w_n\) 之和,\(c\) 为 \(w_n\) 的数量
初始值 \(\vec v_0=\begin{bmatrix}0\\0\\1\end{bmatrix}\),若为 \(0\) 则转移矩阵 \(M_0=\begin{bmatrix}2&-2&1\\0&2&-1\\0&0&2\end{bmatrix}\),若为 \(1\) 则转移矩阵 \(M_1=\begin{bmatrix}2&2&1\\0&2&1\\0&0&2\end{bmatrix}\)
发现交换字符不影响答案,因此假设目前 \(s\) 中 \(0\) 有 \(c_0\) 个,\(1\) 有 \(c_1\) 个,则 \(\sum_{v\subset s} w_n^2\) 为 \((M_0^{c_0}\times M_1^{c_1}\times \vec v_0)[0,0]\)
容易 \(O(1)\) 维护 \(c_0,c_1\)
预处理 \(M_0^{0\sim n}\) 和 \(M_1^{0\sim n}\),则时间复杂度为 \(O(\sum (n+q))\)
\(\textcolor{purple}\odot\) CF2077E Another Folding Strip
一次操作等价于选择若干奇偶交替的位置令 \(a\) 减一,最终全消为 \(0\)
考虑如何计算一个序列 \(a_{1\sim n}\) 的 \(f\)
对于任意一个区间 \([l,r]\),一次操作对 \(\sum_{i=l}^r a_i\) 的影响为 不变 / 加一 / 减一
因此操作次数的下界为 \(\max_{1\le l\le r\le n}|\sum_{i=l}^r a_i|\)
可证可取到下界
因此答案为
令 \(s_i=\sum_{j=1}^i a_j\),则答案为
两式计算方式类似,以下只考虑 $$\sum_{1\le l\le r\le n}\max_{i=l-1}^r s_i$$
令 \(s_i\gets\min(s_i,s_{i-1})\),则转化为求
单调栈即可
时间复杂度 \(O(\sum n)\)
\(\textcolor{purple}\odot\) CF2075E XOR Matrix
由于异或矩阵中不同的数不超过两个,因此 \(a\) 和 \(b\) 中不同的数至多有两个
令 \(A\) 和 \(B\) 都加一
当 \(|a|=|b|=1\) 时,矩阵中只有一种值,贡献为 \(AB\)
当 \(|a|=2,|b|=1\) 或 \(|a|=1,|b|=2\) 时,矩阵中只有两种值,贡献为 \((2^n-2)\binom A2B+(2^m-2)\binom B2A\)
当 \(|a|=2,|b|=2\) 时,贡献为
考虑如何计算 \(\sum_{0\le a_1<A}\sum_{0\le a_2<A}\sum_{0\le b_1<B}[a_1\oplus a_2\oplus b_1<B]\)
把 \([0,a)\) 和 \([0,b)\) 分别拆为 \(O(\log V)\) 个区间,拆分方式同树状数组
枚举 \(a_1,a_2,b_1\) 分别属于的区间,可得到 \(b_2\) 的取值范围,由于拆分方式的特殊性,取值范围内每个数取到的次数都是相同的,可以求出区间与 \([0,b)\) 的交内的数量
时间复杂度 \(O(\sum \log ^2a\log b)\)

浙公网安备 33010602011771号