「Log」2023.12.28 小记

序幕

睡多了还是困。

\(\text{6:40}\):准时到校,补博客,接着做昨天开的题。

题解比较深奥,先打了刷表法的暴力,优化一层之后发现再优化需要填表法,重构了一份出来。

最后前缀和部分看的时候脑子宕机了,卡了好久。

\(\color{blueviolet}{CF1542E2}\)

非常有水平的题。

先枚举相同前缀长度,然后钦定下一位不同,于是问题转化为对于每个 \(i\)\(i\) 阶排列对 \((p, q)\) 的数量,使得 \(p_1 < q_1\)\(\pi(p) > \pi(q)\)。其中 \(\pi(x)\) 为序列 \(x\) 的逆序对数。

\(f_{i, j}\) 表示 \(i\) 阶排列 \(\pi(p) - \pi(q) = j\)。转移考虑枚举开头元素 \(p_1, p_2\) 有:

\(f_{i, j} = \sum\limits_{p_1 = 1} ^ {i} \sum\limits_{q_1 = 1} ^ i f_{i - 1, j - p_1 + q_1}\)

值得注意的是下标可能为负,所以做的时候要整体位移一段。

答案即:

\(\sum\limits_{p_1 = 1} ^ i \sum\limits_{q_1 = p_1 + 1} ^ i f_{i - 1, j - p_1 + q_1}\)

发现只关心开头元素差值,考虑枚举差值 \(d = p_1 - q_1\),则有:

\(f_{i, j} = \sum\limits_{|d| < i} f_{i - 1, j - d} (i - |d|)\)

\(d\) 按正负分开:

\(f_{i, j} = \sum\limits_{d = 1} ^ {i} f_{i - 1, j + d} (i - d) + \sum\limits_{d = 0} ^ {i - 1} f_{i - 1, j - d} (i - d)\)

把前半部分拿出来做以下推导:

\(\sum\limits_{d = 1} ^ {i} i f_{i - 1, j + d} - \sum\limits_{d = 1} ^ {i} d f_{i - 1, j + d}\)
\(\sum\limits_{d = 1} ^ {i} (i + j) f_{i - 1, j + d} - \sum\limits_{d = 1} ^ {i} (j + d) f_{i - 1, j + d}\)

然后发现关于第二维做两种前缀和即可,后半部分类似。

\(\color{blueviolet}{AT\_tdpc\_string}\)

纯种 DP。

\(f_{i, j}\) 表示前 \(i\) 种字符加入后,有 \(j\) 对相邻相同字符的方案数。

新加入的字符有以下三种功能:

  1. 拆开以前相邻的相同字符。

  2. 两个组成一对相邻字符。

  3. 什么也不干。

贡献用组合数计数是简单的,直接暴力枚举上述三种字符数量进行 DP,注意上下界以及初值问题即可。

间幕 \(1\)

中午点了麻辣拌吃。

味道还行,但感觉体验就是一般,近几天应该都不会点了。

下午先补一道上午的题,然后接着做 DP。

\(\color{royalblue}{CF1312D}\)

没啥水平题,一眼秒了。

先确定数字发现分组是简单的,相当于每个数字可以在左或右,最大值以及两个相同元素位置是固定的,也就是有 \(2^{n - 3}\) 种方案。

考虑选数,先从 \(m\) 个中选出 \(n - 1\) 个数,再从 \(n - 1\) 个数中去掉最大值再选一个数,贡献即 \(n - 2\)

有答案:

\(2 ^ {n - 3} \times \dbinom{m}{n - 1} \times (n - 2)\)

\(\color{blueviolet}{CF67C}\)

挺好玩的性质题。

DP状态是显然的,\(f_{i, j}\) 表示 \(a\) 串匹配前 \(i\) 个字符,\(b\) 串匹配前 \(j\) 个字符的最小代价。

前三个操作的转移是显著的,考虑第四个操作以及其代价限制起什么作用。

连续的交换不如添加和删除,唯一可以起到的作用是交换两个数,可以考虑删除中间一段,交换两头的字符,再添加中间的一段。

具体的来讲,假设现在正在处理 \(a_i, b_j\),设 \(b_j\) 最后一次出现在 \(a_1 \sim a_i\) 中的 \(x\) 位置,\(a_i\) 出现在 \(b_1 \sim b_j\)\(y\) 位置,则我们先令 \(a_1 \sim a_{x - 1}\)\(b_1 \sim b_{y - 1}\) 匹配好,然后删除 \(a_{x + 1} \sim a_{i - 1}\),交换后再添加 \(b_{y + 1} \sim b_{j - 1}\),转移是简单的。

\(\color{black}{P2605}\)

状态非常显然,\(f_{i, j}\) 表示第 \(i\) 个点选定为基站,并且总共建了 \(j\) 个基站的最小代价(只考虑前 \(i\) 个),然后就是很裸的线段树优化 DP 转移。

尾声

下班,睡觉。

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