agc056b题解
正解
首先在分析问题的时候不难发现操作的一个性质就是同一个 对应多个所谓的 序列。
对于这种操作对应多个序列不好计数的限制,一般情况下我们有下面两种思路
- 探究一下什么序列能够被得到,而不是从操作序列的角度设计 DP 状态。
- 若硬是从操作序列入手,我们可以通过给操作附上某种特定的顺序,让每一个序列都附上一个唯一的代表元,而这个代表元就是我们需要分题目去设计的。
如果你从第一个思路想的话你会很快陷入瓶颈,不建议自行尝试不然你会很痛苦。
我们从第二个思路入手,那么我们要对操作序列确定一个顺序,使得我们的决策可以唯一化。
考虑用插入法,我们可以从大到小钦定每一个值的位置,就是倒着遍历,。每一次我们把对应的值插到当前最左端的位置。
通过这种方式,我们可以将问题从对 计数变为对上面合法构造的排列 进行计数。
考虑如果 DP,注意到每一次操作都是涉及的是 操作,不妨考虑利用大根堆笛卡尔树的形态进行刻画,笛卡尔树一个很好的特性就是形态是确定的而不是变化的。
那么原题目中的最大值位置 能够产生贡献的区间一定是一个排列上的连续区间,对应到笛卡尔树上就是笛卡尔树的一个子树。那么现在问题转化为对笛卡尔树形态计数,考虑枚举最大值 DP,设 表示当前枚举的最大值位置在大于等于 的范围,管辖的子树区间为 的笛卡尔树形态数量。
转移显然可以考虑递归处理,或者从 传递过来,对于 的这个第三维是好说的,就是。但是 是比较难以确定的,因为我们不好确定这个范围。
这里有一个结论,设 表示 最大值的位置,那么 合法的充要条件是: 是合法的,并且不能存在一个。
必要性是显然的,假设不存在 的话那么我直接把最大值钦定为 也是合法的。考虑证明充分性,如果存在,那么根据前提条件左区间合法性可以知道把最大值钦定在 的左边都是不合法的,而如果把最大值钦定在 中某个位置,那么 了,所以最左端和发位置就是 了,证毕。
那么我们可以预处理 表示 最大值在 的时候, 的最大值位置最小是多少,预处理是 的,转移可以做到,时间复杂度为。
反思
这个题还是比较好的,我们在遇见这种操作序列出现多个对应一个的时候,我们要找出的就是那个序列对应的唯一代表元。通过将结果与唯一的操作序列对应起来,从而设计出无重复的 DP。
- 探究一下什么序列能够被得到,而不是从操作序列的角度设计 DP 状态。
- 若硬是从操作序列入手,我们可以通过给操作附上某种特定的顺序,让每一个序列都附上一个唯一的代表元,而这个代表元就是我们需要分题目去设计的。
笛卡尔树形态特别适合这种计数思想,尤其是当最大值反复横跳的时候考虑笛卡尔树会有奇效,其实笛卡尔树上的 DP,就是所谓的枚举最大值转移。