做题记录 25.5.10
\(\textcolor{blue}\odot\) CF1848F Vika and Wiki
显然具有单调性,倍增,则每次需要求出一个数组变换 \(2^k\) 的结果,等于 \(a_i\gets a_i\oplus a_{i+2^k}\),容易做到 \(O(n\log n)\)
\(\textcolor{purple}\odot\) CF1852C Ina of the Mountain
若 \(a_i=k\) 先令 \(a_i\gets 0\),这样转化为有 \(a_{1\sim n}\),每次选择一个区间减一,至少操作几次使得 \(a\) 在 \(\bmod k\) 意义下为 \(0\)
容易转化为给定 \(a_{1\sim n}\;(a_i\in[0,k))\),每次选择 \(a\) 的一个区间加上 \(k\),求出 \(\sum_{i=1}^n \max(0,a_i-a_{i-1})\) 的最小值
从 \(1\sim n\) 扫描 \(a\)
若 \(a_{i-1}>a_i\) 则 \(a_i\) 无贡献
若 \(a_{i-1}<a_i\),则要么代价增加 \(a_i-a_{i-1}\),要么选择一个 \(j<i\) 令 \(a_{j\sim i-1}\) 都加上 \(k\),此时 \(a_{i-1}>a_i\),\(a_{j+1\sim i-1}\) 的贡献已经计算过了,\(a_j\) 的贡献由 \(\max(0,a_j-a_{j-1})\) 变为 \(\max(0,a_j+k-a_{j-1})\)
当 \(a_j>a_{j-1}\) 时令 \(j\gets j-1\) 增加量一定不会更大,因此最优情况下选择的 \(a_j\) 之前一定无贡献,即贡献会增加 \(a_j+k-a_{j-1}\)(显然每个 \(j\) 至多被使用一次,因此 \(a_j+k-a-{i-1}\ge 0\))
用一个堆保存 \(a_i+k-a_{i-1}\) 的集合,若 \(a_{i-1}>a_i\) 则直接加入堆,否则先把 \(a_i-a_{i-1}\) 加入堆,表示 \(a_{i-1}\) 增加 \(k\) 后的 \(a_i+k-a_{i-1}\),然后从堆中取出最小值累加到答案上,表示选择一个可空区间加上 \(k\),保证每个值只用一次
时间复杂度 \(O(n\log n)\)
\(\textcolor{purple}\odot\) CF1848E Vika and Stone Skipping
对于一个 \(x\),其答案为
由于 \(2\mid 2x\),要使 \(2\nmid \left(a+\frac{2x}a\right)\),则 \(a\) 和 \(\frac{2x}a\) 中必然有一个包含了 \(2x\) 的所有 \(2\) 的因子,设 \(2x=p\times 2^q\),其中 \(2\nmid p\),则 \(a\mid p\) 或 \(\frac{2x}a\mid p\),两者分别有 \(d(p)\) 种选择,共 \(2d(p)\) 种
由于 \(a\le f\),因此 \(\frac{2x}a>a\),而 \(\frac{2x}a\ne a\),因此恰好一半的方案数不合法
即对于一个 \(x\),合法的方案数为 \(d(p)\),其中 \(p\) 为 \(x\) 去除所有 \(2\) 的因子的结果
问题转化为给定一个 \([1,10^9]\) 内的初始值 \(x\),每次再给定一个 \([1,10^6]\) 内的 \(y\),令 \(x\gets y\),维护 \(d(x)\bmod M\)
通过维护 \(x\) 对于 \([1,10^6]\) 内每个质数的最大幂次,可转化为有可重集 \(S\),每次加入一个值或删除一个值,维护集合内值的积,记录 \(M\) 的幂次即可
时间复杂度 \(O(\sqrt x+q\sqrt y+qy^{\varepsilon}\log y)\),空间复杂度 \(O(y)\),容易优化到时间复杂度 \(O(\sqrt x+y\log y+qy^{\varepsilon})\),空间复杂度 \(O(y\log y)\)
\(\textcolor{purple}\odot\) CF1847F The Boss's Identity
发现第 \(n\times n\) 项及之后值都是相同的,因此把前 \(n\times n\) 项排列为一个 \(n\times n\) 的矩阵,显然其中每一列只有 \(O(\log V)\) 个极大等值连续段,总计 \(O(n\log V)\) 段,容易用 \(\text{ST}\) 表示 \(O(n\log n\log V)\) 求出所有段
每段保留编号最小的位置处的值,则转化为给定 \(O(n\log V)\) 个带权点,\(q\) 次询问每次求出权值大于给定值的所有点中最小的编号,容易做到 \(O(n\log n\log V+q\log n)\)
总时间复杂度 \(O(\sum (n\log n\log V+q\log n))\)
\(\textcolor{purple}\odot\) CF1845F Swimmers in the Pool
令 \(l\gets \frac12,t\gets\frac t{2l}\),显然答案不变(此时 \(t\) 为浮点数,为了避免误差在计算时需要按照类似分数的方式)
\(x\) 时刻 \(v_i\) 和 \(v_j\) 相遇当且仅当 \(x(v_i+v_j)\in \mathbb Z\) 或 \(x(v_i-v_j)\in\mathbb Z\)
令 \(S=\{v_i+v_j\mid i\ne j\}\cup\{|v_i-v_j|\mid i\ne j\}\),容易 \(\text{FFT}\) 或 \(\text{NTT}\) 做到 \(O(V\log V)\),则 \(x\) 时刻为相遇时刻当且仅当 \(\exists u\in S,ux\in\mathbb Z\)
答案为
令 \(S'=\{i\mid \exists u\in S,i\mid u\}\),容易 \(O(V\log V)\) 得到,则答案为
容易 \(O(V\log V)\) 计算
总时间复杂度 \(O(V\log V)\)
\(\textcolor{purple}\odot\) CF1845E Boxes and Balls
设最终序列中 \(1\) 的位置的数组为 \(b\),初始序列中 \(1\) 的位置的数组为 \(a\),则合法当且仅当 \(|a|=|b|\),\(\sum |a_i-b_i|\le k\),\(2\mid (k-\sum|a_i-b_i|)\)
令 \(c_i\) 为原序列 \(1\sim i\) 中 \(1\) 的数量
令 \(dp_{i,j,k}\) 表示 \(1\sim i\) 中填了 \(j\) 个 \(1\),跨越前 \(i\) 个空隙的移动总数为 \(k\),该情况下的方案数
转移为
答案为 \(\sum_{i=0}^k [i\equiv k\pmod 2]dp_{n,c_n,i}\)
直接实现为 \(O(n^2k)\) 的
发现对于 \(i\),非 \(0\) 的 \(j\) 一定在 \(c_i\pm O(\sqrt{k})\) 的范围内
时间复杂度可做到 \(O(nk\sqrt k)\)
\(\textcolor{purple}\odot\) CF1844E Great Grids
令 \(0,1,2\) 分别表示 \(\text A,\text B,\text C\),对于每个 \(2\times 2\) 的矩形,假设左上角为 \(0\),则只有以下四种情况:
设矩形为 \(\begin{bmatrix} a&b\\c&d \end{bmatrix}\),则必然满足 \(a+d\equiv b+c\pmod3\),有 \(a-c\equiv b-d\) 和 \(a-b\equiv c-d\),即相邻两行之间每一列两个元素之差为定值,列同理
令 \(c_i=a_{i,j}-a_{i+1,j}\),\(d_i=a_{j,i}-a_{j,i+1}\),则若 \(c_i,d_i\in \{1,2\}\) 就可描述一个合法的矩阵
考虑 \(a_{i,j}=a_{i+1,j+1}\) 的限制,相当于要求 \(c_i\ne d_j\),同理 \(a_{i,j}=a_{i+1,j-1}\) 相当于要求 \(c_i=d_{j-1}\)
二分图染色判定合法性即可
时间复杂度 \(O(\sum (n+m+k))\)

浙公网安备 33010602011771号