做题记录 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}\) 的最小操作次数
转移为
时间复杂度 \(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\),转移为
即 \((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))\),瓶颈在于筛质数

浙公网安备 33010602011771号