做题记录 25.4.19

\(\textcolor{blue}\odot\) CF2086E Zebra-like Numbers

\(t_i=4t_{i-1}+1\) 表示第 \(i\) 个斑马数,显然 \(10^{18}\) 内至多只有 \(30\)

假设正整数 \(x\) 的斑马数拆分为 \(\sum_{i=1}^{30} v_it_i\),显然最优情况下 \(v_i\le 4\),否则不如令 \(v_{i+1}\) 加一

且若存在 \(v_i=4\),则 \(v_{i-1\sim 1}=0\),否则不如换成 \(t_{i+1}\)

每个询问 \([l,r,k]\) 拆为 \([1,r]-[1,l-1]\),转化为询问一个前缀内拆分数量为 \(k\) 的数字数量

考虑数位 \(dp\),令 \(dp_{i,0/1,j,0/1}\) 表示目前考虑 \(i\sim 30\) 位,这些位的取值是否紧贴上界,这些数位的和为 \(j\),是否出现过 \(4\)

显然 \(dp_{\ast,\ast,j,\ast}=0~\text{if}~j>k,dp_{0,\ast,k,\ast}=1\)

对于一个 \(dp_{i,t_1,j,t_2}\),令 \(ct_i\) 表示右端点的斑马数拆分下第 \(i\) 位的值,令 \(lm=\begin{cases}0&t_2=1\\ct_i&t_1=1,t_2=0\\4&\text{otherwise}\end{cases}\) 表示第 \(i\) 位的上限,则转移为

\[dp_{i,t_1,j,t_2}\gets \sum_{v=0}^{lm} dp_{i-1,t_1\land v=lm,j+v,t_2\lor v=4} \]

显然 \(i\)\(j\) 的最大值都是 \(O(\log V)\) 的,因此时间复杂度 \(O(T\log^2 V)\)

代码

参考

\(\textcolor{purple}\odot\) CF2071F Towering Arrays

二分答案,设二分的值为 \(M\),令 \(b_i=M-a_i\),则转化为判定是否存在长度 \(\ge n-k\) 的子序列,满足其中一个位置 \(\ge 0\),这个位置向前依次 \(\ge 1,\ge 2,\cdots\),这个位置向后依次 \(\ge 1,\ge 2,\cdots\)

\(f_i\) 表示 \(1\sim i\) 中选择一个子序列,使得选出的倒数第 \(i\) 个数 \(<i\),可以得到的最大长度,\(g_i\) 表示 \(i\sim n\) 中选择一个子序列,使得选出的第 \(i\) 个数 \(<i\) 所能得到的最大长度,则合法当且仅当 \(\exists i,(b_i\le 0,f_i+g_i-1\ge n-k)\)

\(f\)\(g\) 计算方式类似,考虑如何计算 \(f\)

发现从 \(f_{i-1}\)\(f_i\),一定存在一种最优情况使得后者选择的位置为前者的超集

用一棵线段树维护 \(b\),从前往后扫描,设目前扫描到 \(i\),则线段树中 \((i,n]\) 值为 \(\infty\)\([1,i]\) 中选择的位置处值为 \(\infty\),第 \(i-1\) 个选择的位置和第 \(i\) 个选择的位置之间,线段树 \(p\) 位置保存了 \(b_p-i\)

对于每个 \(i\),先令 \(i\) 位置赋值为 \(b_i\),然后每次找到最后一个 \(\le 0\) 的位置,将其设为 \(\infty\),并将其对应前缀减一,选择的集合大小加一

使用线段树上二分,则时间复杂度为 \(O(n\log n\log V)\)

代码

参考

\(\textcolor{blue}\odot\) CF2071D2 Infinite Sequence (Hard Version)

\(s_i=\bigoplus_{j=1}^i a_j\)

根据 \(a\) 的定义,对于 \(x>\frac n2\),显然有 \(a_{2x}=a_{2x+1}=s_x\)

\(n\) 为偶数则算出 \(a_{n+1}\) 后令 \(n\gets n+1\)

\(P=s_n\)

处理出 \(a_{n+1\sim 2n+1}\)\(a_{1\sim 2n+1}\) 前缀和,这样对于 \(i>2n+1\),必有 \(\lfloor \frac i2\rfloor>n\),形式统一

对于 \(4k>2n+1\),考虑相邻四个数 \(a_{4k},a_{4k+1},a_{4k+2},a_{4k+3}\),显然有

\[a_{4k}=a_{4k+1}=s_{2k}=P\oplus (a_{n+1}\oplus a_{n+2})\oplus (a_{n+3}\oplus a_{n+4})\oplus\cdots\oplus a_{2k}=P\oplus a_{2k}\\ a_{4k+2}=a_{4k+3}=s_{2k+1}=P\oplus (a_{n+1}\oplus a_{n+2})\oplus (a_{n+3}\oplus a_{n+4})\oplus\cdots\oplus (a_{2k}\oplus a_{2k+1})=P \]

由此容易 \(O(\log V)\) 计算一个 \(a_V\)

一组询问 \([l,r]\) 差分为 \([1,r]-[1,l-1]\),令 \(S(x)\) 表示前缀 \([1,x]\) 的答案,\(x\le 2n+1\) 的情况直接返回即可,若 \(x>2n+1\),先补齐至 \(x\equiv 3\pmod 4\),此时显然有

\[\begin{aligned} S(x)=&S(2n+1)+(a_{2n+2}+a_{2n+3}+a_{2n+4}+a_{2n+5})+(a_{2n+6}+a_{2n+7}+a_{2n+8}+a_{2n+9})+\cdots+(a_{x-3}+a_{x-2}+a_{x-1}+a_x)\\ =&S(2n+1)+(2(p\oplus a_{n+1})+2p)+(2(p\oplus a_{n+3})+2p)+\cdots+(2(p\oplus a_{\frac{x-3}2})+2p)\\ \end{aligned}\]

一共有 \(al=\frac{x-(2n+1)}4\) 组,令 \(ct\)\(a_{n+1},a_{n+3},\cdots,a_{\frac{x-3}2}\)\(1\) 的数量,对于 \(a_\ast=1\) 的组 \(2(p\oplus a_\ast)+2p=2(p\oplus1)+2p=2\),对于 \(a_\ast=0\) 的组 \(2(p\oplus a_\ast)+2p=2p+2p=4p\),因此 \(S(x)=S(2n+1)+ct\times2+(al-ct)\times 4p\)

考虑如何计算 \(ct\),显然

\[\begin{aligned} ct=&\sum_{i=n+1}^{\frac{x-3}2}[i\equiv 0\pmod 2]a_i\\ =&\sum_{i=n+1}^{\frac{x-3}2+1}[i\equiv 0\pmod 2]a_i\\ =&\frac12\sum_{i=n+1}^{\frac{x-3}2+1}a_i\\ =&\frac12\left(\sum_{i=1}^{\frac{x-3}2+1}a_i-s_n\right)\\ =&\frac12\left(S\left(\frac{x-3}2+1\right)-s_n\right)\\ \end{aligned}\]

于是递归即可

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

代码

参考

\(\textcolor{purple}\odot\) CF2084G1 Wish Upon a Satellite (Easy Version)

\(f\) 相对地,定义 \(g(s)\) 表示交换先后手之后的最终值

结论为:

\[f(c)=\begin{cases}\min(c_1,c_k)&\text{if}~2\mid k\\ \max(c_1,c_k)&\text{if}~2\nmid k\\\end{cases} \]

\[g(c)=\begin{cases}\max(c_1,c_k)&\text{if}~2\mid k\\ \min(c_1,c_k)&\text{if}~2\nmid k\\\end{cases} \]

可归纳证明

于是答案为

\[\begin{aligned} &\sum_{1\le i\le j\le n}f([p_i,p_{i+1},\cdots,p_j])\\ =&\sum_{1\le i\le j\le n}([2\mid (j-i+1)]\min(p_i,p_j)+[2\nmid (j-i+1)]\max(p_i,p_j))\\ =&\sum_{1\le i\le j\le n}(\max(p_i,p_j)-[2\mid (j-i+1)]\max(p_i,p_j)+[2\mid (j-i+1)]\min(p_i,p_j))\\ =&\sum_{1\le i\le j\le n}\max(p_i,p_j)-\sum_{1\le i\le j\le n}[2\mid (j-i+1)](\max(p_i,p_j)-\min(p_i,p_j))\\ =&\sum_{i=1}^n i^2-\sum_{1\le i\le j\le n}[i\not\equiv j\pmod 2]|p_i-p_j|\\ \end{aligned} \]

问题转化为求 \(\sum_{1\le i\le j\le n}[i\not\equiv j\pmod 2]|p_i-p_j|\) 的最小值

转化为 \(n\) 个点分别在 \(1\sim n\),将其中 \(\lceil\frac n2\rceil\) 个染为黑色,剩余染为白色(黑色的点编号为奇数,白色为偶数,点 \(i\) 位置在 \(p_i\),显然合法染色方式可对应到至少一个 \(p\),且每个 \(p\) 都可对应到一种染色方式),最小化每一对异色点之间的距离和

考虑 \(dp\),令 \(dp_{i,j}\) 表示 \(1\sim i\) 中有 \(j\) 个黑色点,这 \(i\) 个点内部及这 \(i\) 个点向后的贡献之和的最小值

转移时枚举当前点颜色,考虑当前点向后和向前的贡献

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

代码

参考

posted @ 2025-04-20 06:48  Hstry  阅读(15)  评论(0)    收藏  举报