做题记录 26.4.9

\(\textcolor{black}\odot\) CF1408H Rainbow Triples

\(0\)\(p_{1\sim l}\),显然答案的一个上界为 \(\lceil\frac l2\rceil\)

每个 \(>0\) 的数前后一定有一侧数量超过 \(\lceil\frac l2\rceil\),只需考虑一侧

\([1,L]\) 中的 \(>0\) 的数左侧 \(0\) 数量 \(\le \lceil\frac l2\rceil\)\([R,n]\) 中右侧 \(0\) 数量 \(\le \lceil\frac l2\rceil\)

每种颜色可以匹配 \(0\) 一段前缀(\([1,L]\) 中最后一次出现的前一个 \(0\))和一段后缀(\([R,n]\) 中第一次出现的下一个 \(0\)

若答案 \(\ge M\),则必然选择前 \(M\)\(0\) 和后 \(M\)\(0\),合法当且仅当这一范围中颜色的最大匹配至少为 \(M\)

显然实际匹配的一定是一段前缀 \(0\) 和一段后缀 \(0\),因此无需考虑匹配 \(0\) 的位置的约束,问题转化为整张图上颜色的最大匹配

先尽量在左侧匹配,过多则选择右侧能匹配长度最大的反悔,最后尝试在右侧匹配即可

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

代码

参考

\(\textcolor{purple}\odot\) P7916 [CSP-S 2021] 交通规划

容易建模为网络流最小割,求出对偶图后转化为最短路

\(O(nm\log nm\times \sum k)\) 求出所有关键点对之间的最短路,然后 \(O(\sum k^3)\) \(dp\) 即可

时间复杂度 \(O(nm\log nm\times \sum k+\sum k^3)\)

代码

参考

\(\textcolor{black}\odot\) CF1895G Two Characters, Two Colors

用集合划分模型建图,源点向 \(1\) 的点连 \(r_i\),向 \(0\) 的点连 \(b_i\)\(1\) 的点向汇点连 \(b_i\)\(0\) 的点连 \(r_i\),前面的 \(1\) 向后面的 \(0\)\(1\) 的边,答案为 \(\sum r+\sum b\) 减去最小割

转最大流优化之,预先流 \(\min(a_i,b_i)\)

对于 \(a_i\le b_i\) 的点,若为 \(1\)\(S\to i\) 满流,\(i\to T\) 无法接受其它流量,为 \(0\) 同理,从而可以删去这样的 \((a_i,b_i)\)

接下来 \(a_i>b_i\) 的,若为 \(1\) 则可以向后提供 \(a_i-b_i\),若为 \(0\) 则可以从前面接受 \(a_i-b_i\)

从左往右扫描,若为 \(1\) 则插入一个 \(a_i-b_i\),若为 \(0\) 则取出最大的 \(a_i-b_i\) 个(忽略 \(0\))都减去 \(1\) 并计入最大流

容易平衡树优化到 \(O(n\log n)\)

代码

参考

\(\textcolor{black}\odot\) CF1368H1 Breadboard Capacity (easy version)

容易变为最大流,然后转化为最小割,对于一组割,令和源相连为红,和汇相连的为汇,则可证最优情况下每行都同色,或每列都同色

\(dp\) 是容易的,时间复杂度 \(O(n+m)\)

代码

参考

\(\textcolor{black}\odot\) CF1368H2 Breadboard Capacity (hard version)

CF1368H1 Breadboard Capacity (easy version) 基础上矩阵优化即可

时间复杂度 \(O(n+q\log n)\),常数极大

代码

posted @ 2026-04-10 06:48  Hstry  阅读(3)  评论(0)    收藏  举报