刷(shui)题记录 2021.12 [1]
[ABC228-G] Digits on Grid
可以发现行数和列数相当小,可以将其中一维状压,同时因为奇数步和偶数步的操作很类似,只需要考虑其中一种就行了,这里考虑奇数步。
设 \(f(S)\) 表示当前位置所在的行的集合为 \(S\) 的方案数,接下来我们需要计算出 \(g(S)\) ,其意义是所在的列的集合为 \(S\) 的方案数,这时候我们从 \(f(S)\) 中找一个数字 \(a\) 拓展,其能到达的行的集合为 \(D(S,a)\) ,那么可以得到转移:
这个 \(D(S,a)\) 可以使用 \(D(S,a)=\{j\mid i\in S, a_{i,j}=a\}\) 得到。
初始条件显然是 \(f(\{1,2,3,\dots, h\}) = 1\)
[ABC229-G] Longest Y
容易想到二分,然后 \(\verb|check|\) 的时候显然要选择编号连续的一段,保持中间的不动,然后两头往中间靠就行了。
[ABC230-G] GCD Permutation
可以先写一下题目要求的式子:
对于形如 \([n>1]\) 的判断式,可以使用莫比乌斯函数的性质:\(\sum_{d|n} \tilde\mu(d)=[n>1]\) 展开。注意,这个 \(\tilde\mu(n)=-\mu(n)\) 。由于原题的条件式是 \(\verb|and|\) ,因此可以直接将两个求和乘起来。
变化一下:
按照化式子的套路,可以将 \(d,g\) 放到前面去:
后面两个 \(\Sigma\) 可以看成是一个关于 \(d,g\) 的函数,但是因为 \(d,g\) 对 \(i,j\) 的限制其实是一样的,因此设 \(f(d,g)=\sum_{i=1}^n [d|i~\land~g|p_i]\) ,那么式子就变成了:
\(\tilde\mu(n)\ne 0\) 位置不多,将这些位置都找出来。
[ABC225-F] String Cards
写了一堆假做法。
首先将字符串排序,使其满足对于任意一组 \(1\leq i < j\leq N\) ,满足 \(S_i+S_j< S_j+S_i\) 。然后倒着 \(dp\) ,设 \(f(i,j)\) 表示考虑了第 \(i\) 到 \(n\) 个,选择了 \(j\) 个的最小字符串,显然有转移:
[ABC225-G] X
首先可以转化一下题意:\(\mathrm{ANS}=\left(\sum_{i,j} A_{i,j}\right)-\text{不选择的位置}-C\times 横线数\) 。我们要最小化这两个减去的数,可以考虑用最小割。
有两种选择:
- 不选择这个数。
- 选择这个数,尝试和左上角和右上角连接起来,对于其中一个方向,如果不能连接,就加上 \(C\) 。
对于第一种选择,可以这样搞:
对于第二种,以左上为例:
[USACO21OPEN] Balanced Subsets P
容易想到一个 \(O(n^5)\) 的 \(\verb|dp|\) 。设 \(f(i,l,r,0/1, 0/1)\) 表示当前考虑到第 \(i\) 行,第 \(i\) 行选择了区间 \([l,r]\) ,第 \(i\) 行的左端点为递减/递增状态,右端点为递增/递减状态的方案数,转移显然。可以发现可以用二维前缀和优化成 \(O(n^3)\) 。代码非常令人烦躁。
[CF-1366F] Jog Around The Graph
分情况讨论。
对于路径长度小于等于 \(m\) 的,可以使用 \(\verb|dp|\) 求出答案:设 \(f(i,j)\) 表示走了 \(i\) 步,到达节点 \(j\) 的最长长度,转移显然,这里令不能到达的 \(f(i,j)=-\infty\) 。
对于路径长度大于等于 \(m\) 的答案,设长度为 \(l\),这时候路径一定不是简单路径。思考一下性质可以发现,答案的方案一定是走到某一边的一端之后,剩余都是在这条边上来回走动,换而言之,答案一定是形如 \(w_e(l-m)+f(m,u_e/v_e)\) 的。这个东西很明显是一个直线的形式,但是由于坐标范围过大,不能用李超树。将其转化为维护凸包的一半,然后对于凸包上的每一个点都求出贡献。
[CF-1366G] Construct the String
容易想到用 \(\verb|dp|\) 解决,设 \(f(i,j)\) 表示用 \(s_{1\dots i}\) 匹配 \(t_{1\dots j}\) 的最小花费。关键在转移,容易想到删除和匹配一个字符的转移,但是原串中的 \(\verb|'.'|\) 带来的撤回操作并不是那么好处理。但是我们可以将撤回操作和被撤回字符一起处理。具体而言,对于一个位置 \(i\) ,若下一个位置是一个小写字符,其被撤回的操作显然是满足 \(\sum_{j=i}^k |s_j = \verb|'.'||=\sum_{j=i}^k \left|s_j \in [\verb|'a'|, \verb|'z'|]\right|\) 的第一个 \(k\) ,设其为 \(\mathrm{nxt}_i\) 。
那么可以得到转移:
答案显然为 \(f(|s|,|t|)\)