做题记录 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\) 互相连接,只保留其中一条,边权总和为
为关于 \(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\),边权和为
当 \((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)\),瓶颈在于排序

浙公网安备 33010602011771号