「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\) 个数的放置情况:

  1. 加入某个组,保持此组仍为开放。

  2. 加入某个组,封闭此组。

  3. 新建某个组,开放此组。

  4. 新建一个组,封闭此组。

对于新建一个组需要转移负贡献,也就是 \(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}\}\)

尾声

回家睡觉。

posted @ 2023-12-08 07:07  Eon_Sky  阅读(7)  评论(0编辑  收藏  举报