ABC-267解题报告
D. Index × A(Not Continuous ver.)
令 表示考虑序列的前 位, 为取的 个元素时的最大贡献,则 。用 维护取 个元素时的最大贡献,即可将转移优化为 ,总复杂度 。
E. Erasing Vertices 2
可以想到一个很显然的贪心策略:每次取邻居的权值和最小的节点删除。
具体实现上可以采用类似堆优化 的思想,用优先队列维护节点和邻居权值,每次取堆顶元素,松弛邻居节点。
F. Exactly K Steps
首先可以想到和树的直径有关。
做法 1(赛时做法)
对于在直径上的点,距离为 的点要么不存在,要么在直径上。这个比较容易处理。
对于不在直径上的点,可以“向直径跑 步”。可以对于每个直径上的点,都往直径“旁边”跑一遍 DFS 来统计答案。由于不能每个点都跑一遍 DFS,可以将询问离线下来,搜到哪个点就记录答案。
做法 2
设直径的两端分别为 ,则无论是不是直径上的点,距离为 的点要么不存在、要么可以往 跑 步、要么可以往 跑 步。于是从 和 分别跑一遍 DFS 即可。(当然也要离线询问)
G. Increasing K Times
一个排列计数题,可以考虑从小往大插入数。
状态:设 表示插入了前 小的数,增长 次的方案数。可以维护一个 表示已经插入了多少个“与当前插入的数相同的数”,转移会用到。
转移:新插入的数一定是所有数中最大的,从这点入手转移。先考虑什么时候增长的次数不变?放在一个本来就增长的两个数中间。这种情况的方案为 种
只有这一种情况吗?当然不是。还可以放在“与它相同的数”的后面。这种情况有 种。这两种情况并不会重复计算,因为当前数一定是最大的,所以“与它相同的数”后面的位置原先一定不会上升。还有一种容易忽略的情况时放在整个序列的开头,它不属于以上任何一种情况而满足条件。
综上,
什么时候增长的次数会改变?自然是除了以上的情况都会改变。而显然改变只能多 1 次增长,所以
所以转移方程为: