2024.2.20 横渡海峡 年轻的人

数学很难。
头一次感觉非常罚坐,但是细细思考还是很有收获的。
小蜜蜂被 C9 打爆了,雪碧被老鼠打爆了,说明天才少年还是不太行,本来以为 Major 一定是雪碧拿下,看起来还有很大变数。

ARC172F

需要尝试对操作找出一个优秀的描述。
手玩一下操作,偷一张题解的图:

仅看这一段,可以发现我们的操作形如:插入一个字符,然后删除一个字符。
做到这里已经是提高组题目了,令 \(f_{i,j}\) 表示 \(S\) 匹配到 \(i\)\(T\) 匹配到 \(j\) 的最小步数,于是有转移:

\[\begin{aligned} f_{i,j}+1\to f_{i+1,j}\\ f_{i,j}+1\to f_{i,j+1}\\ [S_i=T_j]f_{i,j}+1\to f_{i+1,j+1} \end{aligned} \]

答案即为 \(f_{n,n}-n\),因为每用一次操作会多一步。
从上到下依次是删除 \(i\) 这个字符,在 \(i\) 前面插入 \(T_j\) 这个字符,直接将两个字符匹配,这样的。
需要限制 \(i\le j\),因为一定是先插入再删除,这样的。
然后根据 DP 方程构造方案是简单的,值得一提的是这个题的操作不能够互换,一定要保证操作是从前往后操作,因为我们是从前往后 DP,\(O(n^2)\)
https://atcoder.jp/contests/arc172/submissions/50462209

P4727 / P4128

枚举一个置换 \(x\),考虑他的每一个置换环,设为 \(p_i\)
考虑不动点的个数,首先对于某一个置换环本身,会发现它有 \(\lfloor\frac{p_i}{2}\rfloor\) 个不动点,对于两个置换环,会发现他们共有 \(\gcd(p_i,p_j)\) 个不动点。
于是可以在 \(O(n^2)\) 的复杂度内计算某个置换环的不动点个数,使用 burnside 引理即可计算给定群的个数。
考虑到上述计算过程中每个置换只会和置换环的大小相关联,于是可以将置换个数变为 \(O(p_n)\),需要计算被算重的置换个数,也是容易的。
于是做到 \(O(n^2p_n)\)
https://www.luogu.com.cn/record/147693830

ARC072E

对于 \(i\) 考虑他的答案,发现假设现在前缀是 \(x\),我们实际可以将 \(x\) 变成 \([0,x]\) 内的任何数。
考虑后缀的函数,发现直接维护若干个 \(\min(x,|x-d_i|)\) 的复合不可行,但是可以考虑维护其最小的非 \(0\) 点,换句话说就是维护一个全 \(0\) 前缀。
初值 \(f_n=1\),考虑转移:

  • \(f_{i+1}\le d_i/2\),则没有影响,\(f_{i}=f_{i+1}\)
  • 否则 \(f_{i}=f_{i+1}+d_i\)

容易 \(O(n)\) 转移 \(O(n)\) 判断。
https://atcoder.jp/contests/arc072/submissions/50473911

ARC117F

非常好网络流。
考虑令初始贡献为 \(\sum|b_i|\),计算减少的贡献。
建立超级源点 \(S\),超级汇点 \(T\),令 \(S\) 表示点权为 \(+\)\(T_i\) 表示点权为负。
拆点,这条边的容量是 \(a_i+|b_i|\),表示损失这些贡献。对于 \(b_i>0\)\(out\) 点与 \(T\)连一条容量为 \(2b_i\) 的边,表示在负数连通块会损失这些贡献,对于 \(b_i<0\)\(in\) 点与 \(S\) 连一条容量为 \(-2b_i\) 的边,表示在正数连通块会损失这些贡献。对于原有的边将对应 \(in,out\) 连边即可。
于是现在问题变成了一个最小割问题,跑 dinic 即可,时间复杂度 \(O(\text{Dinic}(n,m))\)
https://atcoder.jp/contests/arc107/submissions/50476837

posted @ 2024-02-20 21:30  cnyz  阅读(13)  评论(0编辑  收藏  举报