做题记录 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]\),转移为
一种情况为选择一个 \(j+a_j-1\ge i\) 的 \([j,j+a_j-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\),转移为
时间复杂度 \(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)\)

浙公网安备 33010602011771号