做题记录 25.3.10

\(\textcolor{blue}\odot\) CF2043F Nim

回滚莫队,维护 \(f_i\) 表示当前区间中异或和为 \(i\) 时能删去的最多数字,\(g_i\) 表示其方案数

时间复杂度 \(O(n\sqrt mV)\),其中 \(V=50\)

实际上区间长度 \(\ge 52\) 时必然有两个相同的值,特判一下有 \(0\) 的情况即可,对于 \(\le 51\) 的情况直接 \(dp\) 即可,时间复杂度 \(O(mV^2)\)

代码

\(\textcolor{purple}\odot\) CF2045J Xorderable Array

一组 \((p,q)\) 合法当且仅当 \(p\oplus q\le \min_{1\le i<j\le n}a_i\oplus a_j\)

证明:

  • 考虑 \(a_i,a_j,p,q\) 的同一二进制位
  • 枚举 \(16\) 种情况,发现 \(p\oplus q>a_i\oplus a_j\) 时一定不合法,\(p\oplus q=a_i\oplus a_j\) 时需要比较下一位,\(p\oplus q<a_i\oplus a_j\) 时合法当且仅当 \(a_i=p\),即此时 \(a_i\)\(a_j\) 之间顺序确定
  • \(a\)\(a_i\oplus(p\&q)\) 排序,则对于一组 \(i<j\)\((p,q)\) 合法当且仅当 \((p,q)\le a_i\oplus a_j\)
  • 即若 \((p,q)\le \min_{1\le i<j\le n}a_i\oplus a_j\),则一定存在合法的 \(a\) 的排列

先求出 \(\min_{1\le i<j\le n}a_i\oplus a_j\),然后统计合法的 \((p,q)\) 数量,两者都可以用 \(\operatorname{Trie}\)

时空复杂度 \(O(n\log V)\),空间复杂度可用压缩 \(\operatorname{Trie}\) 做到 \(O(n)\)

代码

参考

\(\textcolor{blue}\odot\) CF2043E Matrix Transformation

显然每一位之间互相独立,因此转化为 \(O(\log V)\)\(a_{i,j},b_{i,j}\in \{0,1\}\) 的子问题

发现此时行操作只有 \(x=0\) 时有用,列操作只有 \(x=1\) 时有用

因此转化为给定两个 \(n\times m\) 的矩阵 \(a,b\),每次可以把 \(a\) 的一行设为 \(0\),或一列设为 \(1\),问能否转化为 \(b\)

显然同一行、同一列最多进行一次操作

\(a_{i,j}=1, b_{i,j}=0\),则第 \(i\) 行必须操作

\(a_{i,j}=0,b_{i,j}=1\),则第 \(j\) 列必须操作

建立 \(n+m\) 个节点,分别表示 \(1\sim n\) 行是否操作、\(1\sim m\) 列是否操作,令必须进行的操作对应节点为关键节点,连若干条边 \(u\to v\),表示进行操作 \(u\) 后必须进行操作 \(v\),则若任意一个关键节点在环中,原问题无解

转化为如何建图

\(b_{i,j}=0\),则操作 \(j\) 列之后必须操作 \(i\)

\(b_{i,j}=1\),则操作 \(i\) 行之后必须操作 \(j\)

建好图之后有向图判环即可

时间复杂度 \(O(\sum nm\log V)\)

代码

参考

\(\textcolor{blue}\odot\) CF2041I Auto Complete

离线操作,建立字典树,一次 \(\operatorname{dfs}\) 求出 \(\operatorname{dfn}\),即可 \(O(1)\) 比较两个串

模拟操作时每个节点维护一个集合,按优先级排列子树内所有串

时间复杂度 \(O(\sum |str|\log n)\)

代码

参考

\(\textcolor{purple}\odot\) CF2041J Bottle Arrangement

\(b\) 从大到小排序

朴素 \(dp\) 为令 \(dp_{L,p}\) 表示将 \(b_{1\sim L}\) 填到 \(a_{p\sim p+L-1}\) 的最小操作次数

转移为

\[f_{L,p}\to f_{L+1,p}~(b_{L+1}<a_{p+L})\\ f_{L,p}+1\to f_{L+1,p}~(b_{L+1}=a_{p+L})\\ f_{L,p}\to f_{L+1,p-1}~(b_{l+1}<a_{p-1})\\ f_{L,p}+1\to f_{L+1,p-1}~(b_{l+1}=a_{p-1})\\ \]

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

考虑优化该 \(dp\)

先特判 \(n=1\) 的情况

\(a_i>b_L\) 的位置为 \(1\)\(a_i=b_L\) 的位置为 \(0\),其余为 \(-1\)

若区间 \([l,r]\) 中含有 \(-1\) 位置,显然 \(f_{L,l}=+\infty\)

若区间 \([l,r]\) 中含有 \(0\) 且不在 \(l\)\(r\),或 \(l\)\(r\) 处同时为 \(0\),由于 \(L\) 时刻只能扩展 \(l1\)\(r\)\(L-1\) 时刻区间中一定含有 \(-1\),因此 \(f_{L,l}=+\infty\)

对于每个极长 \(1\) 子段 \([l,r]\),只有 \([l,r-L+1]\) \(f\) 不为 \(+\infty\)(暂时不考虑 \(0\)),而这些位置对于之后的转移产生的效果是相同的,因此将它们的最小值记在 \(l\) 位置

set 和并查集维护 \(1\) 的极长连续段,set 内连续段按长度排序,每次将一个 \(0\) 变为 \(1\) 时尝试将其和左右合并,合并时段内 \(f\) 的值取 \(\min\),段长相加,同时在 set 中更新

一个 \(L\) 处理完成后还要删去 set 中长度 \(<L\) 的连续段

最终剩下的连续段即为答案,若没有连续段则无解

然后考虑 \(0\),若一个 \(0\) 与某个连续段相邻,则这个连续段在下一时刻可以用 \(1\) 的代价将长度加一

每个连续段额外记录一个 \(ln\),表示其是否可以将长度加一(若左右两侧都可以加一,则只能选一边),若可以,则将连续段的 \(ln\) 标记为 \(1\),并令 \(f\) 值加一

段的实际长度为记录的长度加上 \(ln\)set 中记录实际长度,并查集中记录非实际长度

段合并时要将 \(ln\) 标记清空

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

代码

参考

\(\textcolor{blue}\odot\) CF2041H Sheet Music

相当于求有多少长为 \(n-1\)\(-1/0/1\) 序列,使得其任意长为 \(k\) 的子段中同时包含或不包含 \(1\)\(-1\)

\(f_i\) 表示长度为 \(i\),不含 \(0\),且最后一个填的为 \(-1\) 的方案数,则答案为 \(1+2\sum_{i=1}^{n-1}\binom{n-1}if_i\)

\(f_0=1\),转移为

\[f_i=\sum_{j=\max(0,i-k+1)}^{i-1}f_j \]

\((j,i]\)\(-1\)\([1,j]\)\(1\)\(-1\) 互换

前缀和优化 \(dp\),时间复杂度 \(O(n)\)

代码

参考

\(\textcolor{purple}\odot\) CF2041F Segmentation Folds

筛出 \([2l,2r]\) 内的质数(预处理 \(\sqrt{\max 2r}\) 内的质数后依次筛一遍),预处理 \([2l,2r]\) 内每个形如 \(X\)\(X.5\) 的数的前一个质数(可以为自身)和后一个质数,然后暴力搜索

时间复杂度 \(O(\sum (R-L+1)\log\log (R-L+1))\),瓶颈在于筛质数

代码

参考

posted @ 2025-03-11 07:36  Hstry  阅读(9)  评论(0)    收藏  举报