做题记录 25.7.27

\(\textcolor{purple}\odot\) CF1661E Narrow Components

线段树维护,每个区间保存左右共 \(6\) 个位置的连通性即可

时间复杂度 \(O(n+q\log n)\),常数极大

代码

\(\textcolor{purple}\odot\) CF1658F Juju and Binary String

\(c_0,c_1\) 分别为 \(0/1\) 的数量

显然 \(m\nmid \frac n{(c_0,c_1)}\iff n\nmid mc_0\) 时无解

一般情况下,序列首尾相接连成环,令 \(0\) 权值为 \(c_1\)\(1\) 权值为 \(-c_0\),则一定存在一个长度为 \(m\) 的区间满足区间和为 \(0\)

证明:

  • 当区间和为 \(0\) 时,区间内 \(m\) 个数中,\(\frac{c_0m}n\) 个为 \(0\)\(\frac{c_1m}n\) 个为 \(1\)
  • \([l,l+m)\) 的区间和为 \(s_l(1\le l\le n)\),因为所有位置权值总和为 \(0\),所以 \(\sum s_i=0\)
  • 若所有 \(s_i\) 都等于 \(0\),显然合法
  • 否则若存在 \(s_i>0\),必然存在 \(s_i<0\)
  • \(s_i>0\)\(s_i<0\) 的过程中,区间内 \(0\) 的数量取值连续,因此一定取到 \(\frac{c_0m}n\),即一定存在 \(s_i=0\)

因此特判无解的情况,若序列中存在区间和为 \(0\) 的则数量为 \(1\),否则从环上找,断为前缀和后缀,区间数量为 \(2\)

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

代码

参考

\(\textcolor{purple}\odot\) CF1657F Words on Tree

每个点字符只有至多两种可能或无限制,令 \(x_i=0/1\) 表示第 \(i\) 个字符串是否翻转,令 \(y_i=0/1\) 表示第 \(i\) 个点在两种可能中取哪一个,则建图为 \(2-\text{SAT}\) 的形式

容易做到 \(O(n+m+\sum |s_i|)\),细节较多

代码

\(\textcolor{purple}\odot\) CF1654F Minimal String Xoration

\(f(x,k)\) 表示根据 \(x\) 变换后的字符串的长度为 \(2^k\) 的前缀,则 \(f(x,k)=f(x,k-1)+f(x\oplus 2^{k-1},k-1)\)

使用类似倍增求 \(\text{SA}\) 的思想,从低到高枚举二进制位,设目前枚举到 \(i\) 位,令 \(f(id'_x,i-1)\) 为 ${f(\ast,i-1)} $ 中字典序第 \(x\) 大的,\(f(id_x,i)\)\(\{f(\ast,i)\}\) 中字典序第 \(x\) 大的,\(rk'_x\) 表示离散化后 \(f(x,i-1)\) 的排名,\(rk_x\) 表示 \(f(x,i)\) 的排名,已知 \(id'\)\(rk'\),要求出 \(id\)\(rk\)

\(id'\) 按照 \([x]<[y]\iff (rk'_x,rk'_{x\oplus 2^i})<(rk'_y,rk'_{y\oplus 2^i})\) 从小到大排序得到 \(id\),从而得到 \(rk\)

最终的 \(id_0\) 即为最优解

时间复杂度 \(O(n^22^n)\),使用基排可以做到 \(O(n2^n)\)

代码

参考

\(\textcolor{purple}\odot\) CF1656F Parametric MST

先将 \(a\) 从小到大排序,显然不改变答案

对于一个确定的 \(t\),考虑如何求出 \(\text{MST}\) 边权和

\(i,j\) 之间边权为 \(a_ia_j+t(a_i+a_j)=(a_i+t)(a_j+t)-t^2\),最终统一减去 \((n-1)t^2\),则只需要考虑 \((a_i+t)(a_j+t)\)

\(a_i+t>0\) 时连向 \(a_1\) 最优,否则连向 \(a_n\) 最优

即一个后缀连向 \(a_1\),一个前缀连向 \(a_n\),去掉重边和自环后显然形成一棵树

考虑 \(t\) 的取值区间 \((-\infty,-a_n)\)\([-a_n,-a_{n-1}]\)\([-a_{n-1},-a_{n-2}]\)\(\cdots\)\([-a_2,-a_1]\)\((-a_1,\infty)\)(需要求最大值,因此区间有交不影响答案)

\(t\in[-a_{p+1},-a_p]\) 时,\(a_i+t\le 0\mid i\le p\)\(a_i+t\ge 0\mid i>p\)

\(a_1\)\(a_n\) 互相连接,只保留其中一条,边权总和为

\[\begin{aligned} &\sum_{i=1}^p(a_i+t)(a_n+t)+\sum_{i=p+1}^{n-1}(a_i+t)(a_1+t)-(n-1)t^2\\ =&\sum_{i=1}^p(a_ia_n+ta_i+ta_n)+\sum_{i=p+1}^{n-1}(a_ia_1+ta_i+ta_1)\\ =&\sum_{i=1}^pa_ia_n+\sum_{i=1}^pta_i+\sum_{i=1}^pta_n+\sum_{i=p+1}^{n-1}a_ia_1+\sum_{i=p+1}^{n-1}ta_i+\sum_{i=p+1}^{n-1}ta_1\\ =&a_n\sum_{i=1}^pa_i+t\sum_{i=1}^pa_i+tpa_n+a_1\sum_{i=p+1}^{n-1}a_i+t\sum_{i=p+1}^{n-1}a_i+(n-1-p)ta_1\\ =&a_n\sum_{i=1}^pa_i+a_1\sum_{i=p+1}^{n-1}a_i+t\left(pa_n+\sum_{i=1}^pa_i+(n-1-p)a_1+\sum_{i=p+1}^{n-1}a_i\right)\\ \end{aligned} \]

为关于 \(t\) 的一次函数,极值在 \(t=-a_{p+1}\)\(t=-a_p\)

即对于 \(t\in[-a_n,-a_1]\) 的部分,只需要在 \(\forall i,-a_i\) 处求出上式的值并取 \(\max\) 即可

然后考虑 \(t\in (-\infty,-a_n)\) 的情况,此时 \(\forall i,a_i+t<0\),即所有点都连向 \(a_n\),边权和为

\[\begin{aligned} &\sum_{i=1}^{n-1}(a_i+t)(a_n+t)-(n-1)t^2\\ =&a_n\sum_{i=1}^{n-1}a_i+t\sum_{i=1}^{n-1}a_i+t(n-1)a_n\\ =&a_n\sum_{i=1}^{n-1}a_i+t\left((n-2)a_n+\sum_{i=1}^na_i\right)\\ \end{aligned} \]

\((n-2)a_n+\sum_{i=1}^na_i<0\) 时,\(t\)\(-\infty\) 时值为 \(\infty\),否则取 \(-a_n\),包括在前面的情况中

\(t\in(-a_1,\infty)\) 时类似,\((n-2)a_1+\sum_{i=1}^n a_i>0\) 时答案为 \(\infty\)

容易前缀和优化做到 \(O(\sum n\log n)\),瓶颈在于排序

代码

参考

posted @ 2025-07-29 14:37  Hstry  阅读(5)  评论(0)    收藏  举报