「Log」2023.12.7 小记
序幕
昨晚做了奇怪的梦……
早上起来好困。
\(\text{6:50}\):疲倦到校。
按例整博客,写写题解啥的,不知不觉就七点半了。
快速开题,感觉看到 $\left \lceil \frac{n}{3} \right \rceil $ 就要分三段构造。
但是想了好几种都被自己叉掉了,看题解果然是精妙构造。
\(\color{blueviolet}{CF297C}\)
考虑排序后分三段构造,设 $t = \left \lceil \frac{n}{3} \right \rceil $。
第一段 \(1 \le i \le t\):
\(a_i = i - 1, b_i = s_i - a_i\)。
第二段 \(t + 1 \le i \le n - t\):
\(b_i = i - 1, a_i = s_i - b_i\)。
第三段 \(n - t + 1 \le i \le n\):
\(b_i = n - i, a_i = s_i - b_i\)。
\(\color{blueviolet}{CF626F}\)
神秘的 DP 题。
首先不难想到的是把 \(a\) 排序,分组时只需要考虑最小值,因为每次加入一个数一定是最大值。
设 DP 式 \(f_{i, j, k}\) 表示处理到第 \(i\) 个数,目前有 \(j\) 个未封闭的组,总不和谐度之和为 \(k\) 的方案数。
考虑第 \(i\) 个数的放置情况:
-
加入某个组,保持此组仍为开放。
-
加入某个组,封闭此组。
-
新建某个组,开放此组。
-
新建一个组,封闭此组。
对于新建一个组需要转移负贡献,也就是 \(k \leftarrow k - a_i\),封闭一个组需要加入当前贡献 \(k \leftarrow k + a_i\)。
转移是简单的,但此方法复杂度较高,而且第三维会出现负数,比较难处理。
尝试给出一种较为好理解优化的方式。把每个组想象成一条正在延伸的线段(若已封闭那么这条线段不会延伸),左端点是组内最小值,右端点是最大值,考虑加入一个 \(a_i\),那么未封闭的所有组最大值至少为 \(a_{i + 1}\),也就是有 \(k \leftarrow k +j \times (a_{i + 1} - a_i)\),相当于所有未封闭线段右端点右移一段距离。
考虑把贡献都变成差分的形式,第三维没了负数,并且值域变小,转移随便写写即可,时间复杂度 \(O(n ^ 2 \max\{k, \max\{a_i\}\})\)。
\(\color{blueviolet}{CF1845E}\)
状态是神秘的,设 \(f_{i, j, k}\) 表示前 \(i\) 个位置放了 \(j\) 个 \(1\),最少可以用 \(i\) 步移动到此状态的状态总数。
第三维是巨大的,发现其上限是 \(O(\sqrt n)\) 的,转移的时候剪枝一下即可。
\(\color{blueviolet}{CF708B}\)
\(0/1\) 的数量都可以求出,然后化式子判断一波即可,已知有解之后贪心放即可。
\(\color{blueviolet}{CF1842H}\)
非常好题目啊。
考虑令 \(x_i \leftarrow x_i +0.5\),限制变为与 \(0\) 的大小关系,注意到这个式子是否成立只需要考虑绝对值较大的数的正负,考虑从小到大加入 \(x_i\),枚举状态,再枚举加入哪一个求出合法方案,除以总方案即答案。
\(\color{royalblue}{CF1537E2}\)
题意可以简化,对于一个前缀复制粘贴到长度为 \(k\)(截断),求所有前缀中这样操作后串字典序最小的。
记录一个最优前缀,枚举当前前缀,比较两者当前位(\(s_i, s_{i \ mod p}\),\(p\) 为记录的最优前缀),可以达到现行复杂度。
\(\color{royalblue}{CF1472G}\)
简单题。
我们称能走多次的为正边,只能走一次的为反边,很显然你要么不动,要么走一些正边最后走一次反边。
先 BFS 处理每一个点的层级,然后 DFS 更新即可,通过正边更新 \(f_{now} \leftarrow \min\{f_{now}, f_{to}\}\),反边则 \(f_{now} \leftarrow \min\{f_{now}, lev_{to}\}\)。
尾声
回家睡觉。