做题记录 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|\) 的基础上减一

可证:

  1. 存在一种最优解使得其中不存在 \(P_2,P_3,P_4\) 之外的组
  2. 存在一种最优解使得其中所有 \(P_3\) 型的组类型都相同,所有 \(P_4\) 型的组都类型相同
  3. 存在一种最优解使得其中 \(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\) 的分数为

\[\max_{i=0}^l (i-2s_i)(l-i-2(s_l-s_i)) \]

\(w_i=i-2s_i\),则分数为

\[\max_{i=0}^l w_i(w_n-w_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|\)

可证可取到下界

因此答案为

\[\sum_{1\le l\le r\le n}\max_{l\le L\le R\le r}\left|\sum_{i=L}^R a_i\right| \]

\(s_i=\sum_{j=1}^i a_j\),则答案为

\[\sum_{1\le l\le r\le n}\max_{i=l-1}^r s_i-\sum_{1\le l\le r\le n}\min_{i=l-1}^r s_i \]

两式计算方式类似,以下只考虑 $$\sum_{1\le l\le r\le n}\max_{i=l-1}^r s_i$$

\(s_i\gets\min(s_i,s_{i-1})\),则转化为求

\[\sum_{1\le l\le r\le n}\max_{i=l}^r s_i \]

单调栈即可

时间复杂度 \(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\) 时,贡献为

\[\begin{aligned} &(2^n-2)(2^m-2)\sum_{0\le a_1\le a_2<A}\sum_{0\le b_1<b_2<B}[a_1\oplus a_2\oplus b_1\oplus b_2=0]\\ =&(2^n-2)(2^m-2)\left(-AB+\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]\right)\\ \end{aligned}\]

考虑如何计算 \(\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)\)

代码

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