做题记录 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\),其答案为

\[\begin{aligned} &\sum_{f\in\mathbb N^+}\left[\exists a\in\mathbb N^+,\frac{(f+(f-a+1))a}2=x\right]\\ =&\sum_{f\in\mathbb N^+}\left[\exists a\in\mathbb N^+,2f+1=a+\frac{2x}a\right]\\ =&\sum_{a\in\mathbb N^+}\left[2\nmid \left(a+\frac{2x}a\right)\right]\\ \end{aligned} \]

由于 \(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\)

答案为

\[\begin{aligned} &\sum_{x\in\mathbb R,0<x\le t} [\exists u\in S,ux\in\mathbb Z]\\ =&\sum_{i\in\mathbb N^+,j\in\mathbb N^+,\frac ji\le t,\gcd(i,j)=1}\left[\exists u\in S,u\cdot\frac ji\in\mathbb Z\right]\\ =&\sum_{i\in\mathbb N^+,j\in\mathbb N^+,\frac ji\le t,\gcd(i,j)=1}\left[\exists u\in S,i\mid u\right]\\ \end{aligned} \]

\(S'=\{i\mid \exists u\in S,i\mid u\}\),容易 \(O(V\log V)\) 得到,则答案为

\[\begin{aligned} &\sum_{i\in\mathbb N^+,j\in\mathbb N^+,\frac ji\le t,\gcd(i,j)=1}\left[i\in S'\right]\\ =&\sum_{i\in S'}\sum_{j\in\mathbb N^+,j\le ti,\gcd(i,j)=1}1\\ =&\sum_{i\in S'}\sum_{j\in\mathbb N^+,j\le ti}\sum_{d\mid i,d\mid j}\mu(d)\\ =&\sum_{i\in S'}\sum_{d\mid i}\mu(d)\left\lfloor\frac{ti}d\right\rfloor\\ \end{aligned} \]

容易 \(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\),该情况下的方案数

转移为

\[dp_{i-1,j,k-|c_i-j|}\to dp_{i,j,k}\\ dp_{i-1,j-1,k-|c_i-j|}\to dp_{i,j,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} 0&1\\2&0 \end{bmatrix} \begin{bmatrix} 0&2\\1&0 \end{bmatrix} \begin{bmatrix} 0&1\\1&2 \end{bmatrix} \begin{bmatrix} 0&2\\2&1 \end{bmatrix} \]

设矩形为 \(\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))\)

代码

参考

posted @ 2025-05-11 07:45  Hstry  阅读(4)  评论(0)    收藏  举报