做题记录 25.3.7

\(\textcolor{blue}\odot\) CF2060G Bugged Sort

一次操作 \(i,j\) 等价于交换 \(i\)\(j\) 两列后两列内上下交换,因此最终序列上下两个值在原序列中也为上下

最终序列一定是按 \(\min(a_i,b_i)\) 递增的,否则一定不满足 \(a\) 递增和 \(b\) 递增的要求

若要交换 \(i,j\) 两列,令 \(k\) 为与两者相异的一列(\(n\ge 3\),因此一定存在),则操作 \((j,k)\)\((i,k)\)\((j,k)\) 即可

因此通过若干次操作,一定可以将各列按 \(\min(a_i,b_i)\) 排序

然后考虑同一列中上下翻转,发现只能同时操作两列,设要翻转 \(i,j\),则操作 \((i,j)\)\((j,k)\)\((i,k)\)\((j,k)\)

考虑 \(dp\),令 \(f_{i,j,0/1}\) 表示前 \(i\) 列中,翻转的列数量的奇偶性为 \(j\),第 \(i\) 列是否翻转,能否到达这一状态

转移时讨论相邻两列是否翻转即可

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

代码

\(\textcolor{blue}\odot\) CF2059E1 Stop Gaming (Easy Version)

转化为长为 \(N=n\times m\) 的数组,有 \(n\) 个位置可以插入数字,要使 \(a\) 变为 \(b\)

将序列从可插入位置处断开,得到 \(m\) 段,令第 \(i\) 段为 \([L_i,R_i]\),位置 \(x\) 属于第 \(bt_x\)

由于 \(a\)\(b\) 内值各自互不相同,因此每个 \(a\)\(b\) 中的匹配位置都是确定的,设 \(a_i\) 匹配 \(b_{p_i}\),不存在则为 \(0\)

\(1\)\(N\) 扫描 \(a_i\)

\(p_i\) 等于 \(0\),则 \(a_i\) 必须被删去

\(p_i<p_{i-1}+1\),则 \(a_i\) 必须被删去

\(p_i=p_{i-1}+1\),显然目前没有问题

\(p_i>p_{i-1}+1\),则最终序列中 \(a_{i-1}\)\(a_i\) 之间必须插入 \(b\) 的区间 \((p_{i-1},p_i)\) 中的数,因此最终序列中 \(a_{i-1}\) 必被移到 \(R_{bt_{i-1}}\) 及之后,这样当其在 \(R_{bt_{i-1}}\) 位置时就可以插入 \(b_{p_{i-1}+1\sim p_i-1}\),若不满足该条件则 \(a_i\) 必被删除

\(a_i\) 必被删除,则 \(a_{L_{bt_i}}\sim a_{i}\) 都必须至少右移 \(R_{bt_i}-(i-1)\) 位(显然这个区间内部在移动 \(R_{bt_i}-(i-1)\) 步之前不可能插入数字)

若左端点移动 \(R_{bt_i}-(i-1)\) 步后到达其匹配点的右侧,则 \([L_{bt_i},i)\) 中的位置必然有同样的情况,此时整块都必须删除,最多保留 \(a_{1\sim L_{bt_i}-1}\),至少加入 \(N-(L_{bt_i}-1)\) 个数

否则至少加入 \(N-(i-1)\) 个数

可以证明可以取到这一下界

代码

参考

\(\textcolor{blue}\odot\) CF2057E2 Another Exercise on Graphs (hard version)

二分答案,转化为判定对于任意 \(a\to b\) 的路径,是否满足路径上边权大于二分的值的边的数量小于 \(k\)(询问的答案为满足该条件的最小值)

令边权大于二分值的为 \(1\),小于等于的为 \(0\),则相当于求 \(a\)\(b\) 的最短路是否小于 \(k\)

预处理 \(f_{i,a,b}\) 表示边权 \(>w_i\)(边权从小到大排序后的第 \(i\) 个记为 \(w_i\))的为 \(1\),其余为 \(0\)

\(f_{0,a,b}\) 容易 \(\operatorname{Floyed}\) \(O(n^3)\) 求,从 \(f_{i-1,\ast,\ast}\)\(f_{i,\ast,\ast}\) 容易 \(O(n^2)\) 做,因此可以 \(O(n^2 m)\) 预处理

查询时直接借助 \(f\) 即可,单次时间复杂度 \(O(\log m)\)

这样得到时间复杂度 \(O(\sum(n^2m+q\log m))\) 的算法,可以通过简单版

考虑优化预处理的部分

\(f_{i-1,\ast,\ast}\)\(f_{i,\ast,\ast}\) 相当于加入一条边权为 \(0\) 的边,若使用并查集将边权为 \(0\) 的边缩为一个点,则若加入的边没有导致并查集改变,\(f_i=f_{i-1}\),而导致改变的只有 \(n-1\) 条,因此只需要保存 \(n-1\)\(f_{x,\ast,\ast}\) 即可

时间复杂度降为 \(O(\sum(n^3+q\log n))\)

代码

参考

\(\textcolor{purple}\odot\) CF2056F1 Xor of Median (Easy Version)

对于给定的 \(cnt_{0\sim m-1}\),其对应的 \(a\) 的数量为 \(\frac{n!}{\prod_{i=0}^{m-1}cnt_i!}\)

由于异或的性质只有当 \(\frac{n!}{\prod_{i=0}^{m-1}cnt_i!}\equiv 1\pmod 2\) 时这组 \(cnt\) 才会对答案产生贡献

\(F(x)=\max_{2^v|x!} (v)\),则这一条件等价于 \(F(n)=\sum_{i=0}^{m-1}F(cnt_i)\)

其成立当且仅当 \(\forall i\ne j,cnt_i\&cnt_j=0\)\(\sum cnt_i = n\),即 \(cnt\)\(n\) 的一组二进制拆分

证明:

  • \[F(n)=\left\lfloor\frac n2\right\rfloor+\left\lfloor\frac n4\right\rfloor+\left\lfloor\frac n8\right\rfloor+\cdots \]

  • \[\sum F(cnt_i)=\sum \left\lfloor\frac{cnt_i}2\right\rfloor+\sum\left\lfloor\frac{cnt_i}4\right\rfloor+\sum\left\lfloor\frac{cnt_i}8\right\rfloor+\cdots \]

  • 由于 \(\sum cnt_i=n\),因此 \(\sum \left\lfloor\frac{cnt_i}{x}\right\rfloor\le \left\lfloor\frac nx\right\rfloor\),要使 \(F(x)=\sum F(cnt_i)\),必须对于每个 \(2^k\),都有 \(\large\sum \left\lfloor\frac{cnt_i}{2^k}\right\rfloor= \left\lfloor\frac n{2^k}\right\rfloor\)
  • 若不是二进制拆分,设 \(n\)\(2^v\) 位拆为若干个 \(2^{v-1}\),且 \(v\) 为被拆的最高的二进制位,则对于 \(k=v\) 无法满足上式

此时最大的 \(cnt_i\) 包含 \(n\) 的最高二进制位,因此其严格大于 \(\frac n2\)

\(a\) 的中位数一定为 \(a\) 的最大值

\(ct\) 为给定的 \(n\) 的二进制下为 \(1\) 的数量

枚举 \(a\) 的最大值 \(0\le x<m\),对应 \(a\) 的数量在模 \(2\) 意义下等于

\[\sum_{k=1}^{ct}\begin{Bmatrix}ct\\ k\end{Bmatrix}\binom{x}{k-1} \]

其中 \(k\) 枚举非 \(0\)\(cnt\) 数量,\(\begin{Bmatrix}ct\\ k\end{Bmatrix}\)\(cnt\) 的划分,\(\binom{x}{k-1}\)\(cnt\)\(0\) 位置的选法

若其为奇数则答案异或上 \(x\)

时间复杂度 \(O(km)\)

代码

参考

\(\textcolor{blue}\odot\) CF2056E Nested Segments

先考虑 \(m=0\) 的情况

此时一共可以有 \(2n-1\) 个,构造方式是在 \([1,n]\) 上建立线段树,线段树的每个节点对应一个区间,其中线段树划分两个儿子时不要求为中点

\(g_n\) 表示其方案数,则有 \(g_1=1\)\(g_n=\sum_{x+y=n}g_xg_y\)

发现 \(g_n=H_{n-1}\),其中 \(H\) 为卡特兰数列,因此可以 \(O(n)\) 预处理所有 \(g_i\)

然后考虑 \(m\ne 0\) 的情况

先加入 \([1,n]\) 和所有 \([i,i]\)(并去重),显然不影响方案数

然后根据嵌套关系建出树

对于结点 \(u\),令 \(dg_u\) 表示结点 \(u\) 的儿子数量

由于加入了所有 \([i,i]\),区间 \([l,r]\) 的所有儿子一定为 \([l,r]\) 的一种划分

将每个子区间缩为一个点,则转化为 \(n=dg_u\)\(m=0\) 的情况

显然每个子树独立,因此答案为每个非叶子结点的方案数之积

即答案为 \(\prod_ig_{dg_i}\),其中 \(g_0=1\)\(g_i=H_{i-1}\)

时间复杂度 \(O(n\log n)\),瓶颈在于建树时的排序,可基排优化到 \(O(n)\)

代码

参考

\(\textcolor{purple}\odot\) CF2055E Haystacks

假定已经确定了顺序为 \(1\sim n\),则最优策略显然为尽量放到之前的,若还有剩下的则放到之后的

\(c_i=\max(0,\sum_{j=1}^i a_j-\sum_{j=1}^{i-1}b_j)\) 表示第 \(i\) 个位置清空时总计(包含之前移到后面的)有至少 \(c_i\) 个要放到后面

显然必须满足 \(c_n=0\),否则该顺序不合法

这种顺序的总移动次数为 \(\sum_{i=1}^n a_i+\max_{i=1}^n c_i\)

然后考虑没有确定顺序的情况

先忽略 \(c_n=0\) 的限制

由于 \(c_i=\max(0,a_i+\sum_{j=1}^i (a_j-b_j))\),因此把 \(a_i-b_i\le 0\) 的放到前面一定不劣

若相邻两个为 \(y,x\),要交换为 \(x,y\) 并使答案不劣,则必须满足 \(\max(a_x,a_x-b_x+a_y)\le \max(a_y,a_y-b_y+a_x)\),分类讨论得 \(a_i-b_i\le 0\) 的部分按 \(a\) 升序排序,\(a_i-b_i>0\) 的部分按 \(b\) 降序排序

再考虑 \(c_n=0\) 的限制

由于 \(c_n=\max(0,\sum_{i=1}^n a_i-\sum_{i=1}^{n-1}b_i)\),相当于 \(\sum_{i=1}^n a_i-\sum_{i=1}^{n-1}b_i\le 0\),即 \(b_n\le \sum_{i=1}^n (b_i-a_i)\),因此初始序列中满足 \(b_x\le \sum_{i=1}^n (b_i-a_i)\) 的位置 \(x\) 才可能在最终序列中作为最后一个

枚举合法的位置,预处理 \(vl_i=a_i-b_{i-1}\) 的前后缀和最值即可总计 \(O(n)\) 求出最优解

时间复杂度 \(O(n\log n)\),瓶颈在于排序

代码

参考

\(\textcolor{purple}\odot\) CF2053I1 Affectionate Arrays (Easy Version)

由于 \(b\) 的总和 \(s\) 等于 \(a\) 的总和,而 \(a\) 中每个元素绝对值都不超过 \(s\),因此尝试令最大子段和等于 \(s\)

发现只要令 \(b\) 的任意前缀和在 \([0,s]\) 中即可

\(1\)\(n\) 扫描,记录区间 \([l,r]\)\(rs\),表示目前为止 \(b\) 的最小长度为 \(rs\)(代码中记录的为最少的插入的数字,即最小长度减去 \(i\)),仅当前缀和在 \([l,r]\) 中时可取到

初始 \(l=r=rs=0\)

设当前加入的为 \(a_i\),则令 \(l\gets \max(0,a_i+l)\)\(r\gets \min(s,a_i+r)\)

若此时 \([l,r]=\emptyset\),则令 \(rs\) 加一,并令 \(l\gets\max(0,a_i)\)\(r\gets \min(s,a_i+s)\)

该过程正确性显然

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

代码

参考

\(\textcolor{purple}\odot\) CF2049F MEX OR Mania

区间 \([l,r]\) 合法当且仅当 \(\max a_{l\sim r}=2^k-1\)\(a_l\sim a_r\) 取遍 \(0\sim 2^k-1\)

由于 \(k\) 只有 \(O(\log n)\) 种,因此枚举 \(k\)

对于一个 \(k\),将序列从 \(\ge 2^k\) 的位置拆开,则得到若干子段,若一个子段中本质不同数字数量为 \(2^k\) 则可以取这个子段

其成立的前提为区间长度超过 \(2^k\),而由于每次都是单点加,只会出现区间分割,而不会合并,因此对于每个长度 \(\ge 2^k\) 的开一个 \(2^k\) 长度的桶即可

分裂时仅暴力修改较小的一段内的信息

时间复杂度 \(O(n\log^2 n)\)

代码

参考

posted @ 2025-03-08 06:42  Hstry  阅读(18)  评论(0)    收藏  举报