做题记录 25.4.10

\(\textcolor{blue}\odot\) CF1928E Modular Sequence

显然 \(\forall a_i,a_i\equiv x\pmod y\)

\(s\gets \frac{s-n \cdot (x\bmod y)}y\)(若无法整除或出现负数则无解),则转化为一个序列 \(b_{1\sim n}\)\(\sum b_i=s\)\(b_1=\lfloor\frac xy\rfloor\),满足 \(b_{i+1}=0\)\(b_{i+1}=b_i+1\),则 \(a_i=b_iy+(x\bmod y)\) 为一组可行的 \(a\)

\(b\) 中每一段长度为 \(O(\sqrt n)\) 的,可 \(dp\)\(f_s\) 表示 \(\sum b_i=s\) 的情况下 \(b\) 的最小长度,记录转移来源,可构造方案

时间复杂度 \(O(S\sqrt S+\sum s)\),其中 \(S=\max s\)

代码

参考

\(\textcolor{blue}\odot\) CF1927G Paint Charges

\(f_i\) 表示覆盖 \(1\sim i\) 的最小代价

一种情况为选择 \([i-a_i+1,i]\),转移为

\[f_i\gets f_j+1\;(\max(0,i-a_i)\le j<i) \]

一种情况为选择一个 \(j+a_j-1\ge i\)\([j,j+a_j-1]\),转移为

\[f_i\gets[j+a_j-1\ge i]\;\;f_{j-1}+1 \]

第三种情况为选择一对 \([y-a_y+1,y]\)\([x,x+a_x-1]\),满足 \(x<y,x+a_x-1\ge i,y\le i,y-a_y+1\le x\),转移为

\[f_i\gets[\exists y-a_y+1\le x<y,x+a_x-1\ge i]\;\; f_{y-a_y}+2 \]

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

代码

参考

\(\textcolor{purple}\odot\) CF1920F2 Smooth Sailing (Hard Version)

选择一个岛屿的格子,向边缘引一条射线(射线沿着网格线,不穿过网格),则路径合法当且仅当穿过射线奇数次且闭合

建立 \(O(nm)\) 个点 \(p(i,j,o)\;(1\le i\le n,1\le j\le m,o\in\{0,1\})\) 表示目前在 \((i,j)\),穿过射线 \(o\) 次(其中 \((i,j)\) 不是岛屿)

预处理 \(ds(i,j)\) 表示格子 \((i,j)\) 到最近的火山的距离

每个点 \(p(i,j,o)\) 点权为 \(ds(i,j)\),建出图后一组询问 \((x,y)\) 等价于求 \(p(x,y,0)\)\(p(x,y,1)\) 之间路径最小点权的最大值

显然建立的图为无向图,因此转化为 \(\text{Kruskal}\) 重构树上求 \(\text{lca}\)

时间复杂度 \(O((nm+q)\log nm)\),把排序和 \(\text{lca}\) 做到线性则优化到 \(O(nm\alpha(nm)+q)\)

代码

参考

\(\textcolor{purple}\odot\) CF1923F Shrink-Reverse

显然把翻转操作放在最后一定不劣,且翻转超过两次一定不优

若翻转了两次,相当于去掉前缀和后缀的 \(0\),由于比较最终结果时忽略前导 \(0\),因此实际等价于去除后缀 \(0\),若中间一段都是 \(1\) 显然与翻转一次相同,若中间一段存在 \(0\) 则把中间一段最右侧的 \(1\) 与一个 \(0\) 交换且翻转一次,显然更优

综上,翻转只会进行至多一次且在最后

若不翻转,则双指针每次把第一个 \(1\) 与最后一个 \(0\) 交换,直到步数用尽或 \(1\) 集中在最后为止

若翻转一次,相当于把一段前缀中的 \(1\) 全部移到后面,然后最小化后缀反串的字典序

先把整个字符串翻转,则等价于选择一个区间,使得把区间外的 \(1\) 从后往前填充到区间中后这个区间的字典序最小

考虑一个区间 \([l,r]\) 能成为被选择的区间的条件,发现合法当且仅当区间外 \(1\) 的数量不超过 \(k\),且区间内 \(0\) 的数量不小于区间外 \(1\) 的数量,显然具有单调性,因此双指针对于每个左端点求出最小合法右端点

这样得到 \(O(n)\) 个区间(显然右端点不取最小值时不优),可证取长度最小的中字典序最小的一个最优

这一过程可 \(\text{SA}\) 实现

时间复杂度 \(O(n\log n)\),若使用 \(\text{SA-IS}\) 则可到 \(O(n)\)

代码

参考

\(\textcolor{purple}\odot\) CF1924D Balanced Subsequences

考虑对于一个确定的括号序列 \(s_{1\sim n+m}\),求出它的最长合法括号子序列

维护一个栈,扫描序列,若为左括号则入栈,若为右括号,栈非空时则弹栈,否则说明当前右括号无法匹配

最长合法括号子序列长度为 匹配的右括号数量乘以 \(2\)

要使长度为 \(2k\),等价于有恰好 \(m-k\) 个右括号没有匹配

将扫描过程中的 \((x,y)\) 连接为一条路径,其中 \(x\) 为当前扫描的括号下标,\(y\) 为栈中左括号数量

相当于从 \((0,0)\) 出发走 \(n+m\) 步,每次从 \((x,y)\) 走到 \((x+1,y+1)\)\((x+1,\max(0,y-1))\),最终走到 \((n+m,n-k)\)

其方案数等价于从 \((0,0)\) 走到 \((n+m,n-m)\),每次 \(x\) 坐标加一,\(y\) 坐标改变 \(1\),且经过的最小 \(y\) 坐标为 \(k-m\)

旋转 \(45^{\circ}\),等价于 \((0,0)\) 开始走到 \((m,n)\),且碰到直线 \(y=x+k-m\) 的方案数

可求出方案数为 \(\binom{n+m}k-\binom{n+m}{k-1}\)

时间复杂度可做到 \(O(V+T)\)

代码

参考

\(\textcolor{purple}\odot\) CF1919F2 Wine Factory (Hard Version)

若使用最大流,则 \(S\)\(i\) 连容量 \(a_i\) 的边,\(i\)\(T\) 连容量 \(b_i\) 的边,\(i\)\(i+1\) 连容量 \(c_i\) 的边

转化为最小割,则存在一种最优解使得对于每个 \(i\)\(S\to i\)\(i\to T\) 中恰好只割了一条

线段树维护网络,节点 \(k[l:r]\) 中保存 \(v(0/1,0/1)\) 表示割了 \((S\to l)\;/\;(l\to T)\)\((S\to r)\;/\;(r\to T)\) 的情况下的最小割

合并为 \(F(a,d)\gets L(a,b)+R(c,d)+[(b,c)=(1,0)]w\),其中 \(F\) 代表父节点的 \(v\)\(L\)\(R\) 代表两个儿子的 \(v\)\(w\) 表示中间的 \(c\) 的值

时间复杂度 \(O(n+q\log n)\)

代码

参考

posted @ 2025-04-22 07:43  Hstry  阅读(5)  评论(0)    收藏  举报