做题记录 25.7.2

\(\textcolor{black}\odot\) CF1710E Two Arrays

\(a\)\(b\) 从小到大排序,显然不改变答案(注意起点位置可能变化,设移到 \((sx,sy)\)

二分答案(显然答案在 \([1,a_{sx}+b_{sy}]\) 中),设为 \(M\),令 \(\le M\) 的点为 \(\text A\) 结束的点,\(>M\) 的点为 \(\text B\) 结束的点,从 \((sx,sy)\) 出发,每次可以修改 \(x\) 坐标和 \(y\) 坐标之一

显然从 \(\le M\) 的点出发一定会移到 \(<M\) 的点,反之同理,因此为二分图

二分图博弈先手必胜当且仅当起点为最大匹配必经点,等价于原图和删去 \((sx,sy)\) 后的图最大匹配相同

最大匹配等于总点数减去最大独立集,因此考虑求出最大独立集

考虑如何求出一张图的最大匹配,左部点占据一个类似杨表的形状,剩余部分为右部点

令第 \(i\) 行中 \(1\sim lr_i\) 为左部点,第 \(j\) 列中 \(1\sim ud_j\) 为左部点

则可证图的一个最大独立集为选择一个 \((x,y)\),取 \((1\sim x,1\sim y)\) 中的左部点和 \((x+1\sim n,y+1\sim m)\) 中的右部点,令数量为 \(F(x,y)\),通过一定预处理容易 \(O(1)\) 求出(注意特殊处理删去的点)

发现 \(mx_x=\text{arg max} F(x,\ast)\) 单调,因此可以双指针

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

代码

参考

\(\textcolor{blue}\odot\) CF1705E Mark and Professor Koro

答案等于 \(\lfloor\log_2(\sum 2^{a_i})\rfloor\),容易线段树维护

时间复杂度 \(O(q\log V)\)

代码

\(\textcolor{blue}\odot\) CF1706D2 Chopping Carrots (Hard Version)

\(S_i=\{\lfloor\frac{a_i}x\rfloor\mid x\in\mathbb N^+\}\),然后扫描值域,双指针出 \([l,r]\) 满足 \([l,r]\cap \bigcup_{i=1}^n S_i\ne\mathbb\emptyset\) 的范围跟新答案

暴力实现时间复杂度 \(O(\sum n\sqrt V)\),空间复杂度 \(O(n\log V)\),无法接受

考虑值域从大到小扫描,对于每个 \(a_i\),初始在桶中插入 \(\max S_i\),扫描完 \(\max S_i\) 后向桶中插入 \(\text{max 2nd} S_i\),然后清空 \(\max S_i\),保证空间复杂度为 \(O(n+V)\)

时间复杂度不变

代码

参考

\(\textcolor{blue}\odot\) CF1701F Points

\(h_i\) 表示 \(i\) 处是否有点,\(c_i=\sum_{x=1}^d h_{i+x}\),一次操作对 \(c\) 的影响为区间加或减,线段树维护 \(c,\binom{c}2\) 的区间和即可,时间复杂度 \(O(q\log V)\)

代码

\(\textcolor{blue}\odot\) CF1701E Text Editor

\(O(n)\) 特判无法匹配的情况

对于可以匹配的情况,显然最优解有两类:只进行 \(\text{left}\)\(\text{backspace}\),这一类操作次数为 \(n-\text{lcp}(s,t)\),容易 \(O(n)\) 求出;先进行 \(\text{left}\)\(\text{backspace}\) 使一段后缀匹配,然后进行一次 \(\text{home}\),然后进行 \(\text{right}\)\(\text{backspace}\) 使得一段前缀匹配,前后缀不交,考虑如何求出这一类的操作次数

将序列划分为三段,先操作后缀使之匹配,然后跳到前面操作前缀,中间部分已经匹配

\(f_{i,j,k}\) 表示 \(s_{1\sim i}\)\(t_{1\sim j}\) 匹配,当前在第 \(k\)

显然 \(f_{0,0,\ast}=0\),这一类解的答案为 \(f_{n,m,2}+1\)(要加上 \(\text{home}\) 的一次操作)

若不匹配当前字符,则转移为

\[f_{i,j,0}\gets f_{i-1,j,0}+2\\ f_{i,j,2}\gets f_{i-1,j,2}+1 \]

\(s_i=t_j\),则考虑匹配两者,转移为

\[f_{i,j,k}\gets f_{i-1,j-1,k}+[k\ne 1] \]

若跳到下一段,则转移为

\[f_{i,j,k}\gets f_{i,j,k-1} \]

时间复杂度 \(O(\sum n^2)\),使用滚动数组空间复杂度做到 \(O(n)\),用 short\(O(n^2)\) 空间也可过

代码

参考

posted @ 2025-07-03 08:43  Hstry  阅读(4)  评论(0)    收藏  举报