建议结合独立思考使用本题解。
A 没什么价值略去。
B
有一个序列 \(a\),通过把它的一个子区间进行升序排序生成了 \(b\)。
现在给出 \(a,b\),求出可以通过该操作使 \(a\) 变为 \(b\) 的最长子区间的左右端点,输出任意一个。
\(n\le 2\times 10^5\)
如果存在一个位置,使得 \(a_{p}\neq b_{p}\),那么答案一定包含这个位置,则只需贪心地在 \(b\) 中找包含它的极长不降子区间即可。
否则我们需要找出 \(a=b\),我们需要找出序列的极长不降子区间,扫一遍分段即可。
代码
C
有一个小写字母字符串,每次操作可以选择其中不相邻的一些位置删除,然后把剩余的部分进行拼接。
求使得字符串的所有字符相同的最小操作次数。
\(n\le 2\times 10^5\)
不妨考虑在已知剩余的字母 \(c\) 的前提下进行考虑:
发现一定不会操作所有 \(c\),加入它们是不优的。
同时发现删除一个连续段需要的操作次数是 \(\lfloor \log_{2}(len) \rfloor+1\),而答案为该字符把原串分成的所有连续段所需的操作次数的最大值。
故只需最小化最大连续段长,枚举每个位置,考虑该位置字符与上一次出现的间隔进行更新即可。
代码
D
有 n 个不连续(指 \(r_i<l_{i+1}-1\))区间,现在要进行选取 k 不同的位置,要求这些位置都在某个区间内。
若最大一个选取位置为 \(p_r\) 位置构成的连续段个数为 \(cnt\),则权值为 \(p_r+2cnt\),最小化权值。
\(n\le 10^5,1\le l_i\le r_i\le 10^9,k\le 10^9\)
一种方案是贪心地选取前缀,此时最小化了 \(p_{r}\)。
发现如果要除了最后一个,一个区间要么填满要么不填,那么发现前缀中只有长度为 1 的区间不填可能更优。
那么枚举前缀贪心地,记一下长度 1 的区间个数即可。
代码
E
给定一个合法括号序列。
定义一个合法括号序列的权值为,不断地删除某两个相邻的左右括号,将代价加上原右括号右边的括号数量,最后把清空序列所需的最小代价。
可以进行不超过 k 次操作,每次选取一个括号移动到另一个位置,要求每一次操作后仍然是合法括号序列。
最小化得到的合法操作序列的权值最小值。
\(n\le 10^5,0\le k\le 10^9\)
(PS:原题 \(k\le 5\))
如果把括号序列的树型结构建出来的话,答案就是 \(\sum\limits dep_{u}-n\),按照后序删除即可。
这个数值同时等于 \(\sum\limits sz_{u}-n\)。
考虑一次操作,发现最优一定是选择一个最大的子树,把它拆掉。
于是把子树大小拍成序列,求前 \(k\) 大和即可。
代码
F
Luogu
给定一个数轴,在其上一些位置种共 m 棵树,满足:
只在整点位置种树,不存在两个树占用同点。
每棵树可以向左右中一个方向倒下,占用长度为 \(k+1\) 的区间(即 \([x,x-k]\) 或 \([x,x+k]\)),要求存在一种方案使得倒下占用的位置都在 \([1,n]\) 内,且无重叠。
求合法树位置序列个数。
\(n,m,k\le 10^5\)
思路解析
建立双射,写出转移。
从各个角度考虑优化和转化。
预处理
考虑让每棵树贪心地向左倒,如果不能向左再向右,然后来考虑树倒下占用位置的情况进行计数。
(本质上是构建了二者间的 双射)
如果一个区间和上一个间距不够大,则可以有 2 的方案数(因为该区间可以是由左端点位置的树或是右端点位置的树生成),否则方案数为 1,故列出转移式:
\(f_{i,j}=2\sum\limits_{t=0}^{k-1}f_{i-1,j-k-t}+\sum\limits_{t=k}^{j}f_{i-1,j-k-t}\)。
直接前缀和优化可做到 \(\mathcal O(n^{2})\)。
生成函数
注意到第一维这里很明显有层(指转移式与 \(i\) 无关)的概念,故对第二维构造生成函数。
每层转移相同,把转移式写作刷表的形式可以发现是卷积的形式,用多项式快速幂即可做到 \(\mathcal O(n\log n)\)。
如果你对生成函数继续推导甚至可以得到 \(\mathcal O(n)\) 的式子,但这里不作重点展开。
容斥
从另一个角度看,可以是看成决策 m 个结束位置,要求任意两个位置之间距离 \(>k\),之后每有距离 \(\leq 2k\) 乘上一个 2 的系数。
故考虑做 \(f_{i}\) 表示恰好若干个距离 \(>2k\) 的方案数,答案就是 \(\sum\limits_{i=0}^{m} 2^{m-i}f_{i}\)。
这样我们就可以把这些方案减去并隔板,那么钦定有 \(i\) 个距离 \(>2k\) 的方案数有 \(g_{i}=\binom{m}{i}\binom{n-mk-ik}{m}\)。
用二项式反演再推推式子就可以做到 \(\mathcal O(n)\)。
网格图
考虑之前的转移式,由于有层的概念,并且转移范围和系数都是常数,所以可以把问题映射到网格图上的路径权值和计数问题。
直接做图是这样的:
![[Pasted image 20241111133950.png]]
这样边的种类太多了,考虑进行变换。
注意到上面的 dp 式子是区间转移的形式,那么我们可以考虑变为单点转移。
\(f_{i,j}=f_{i-1,j}+(2f_{i-k-1,j-1}-f_{i-2k-1,j-1})\)。
这个式子的含义是在 \([i-k,i]\) 放置区间时,要容斥掉所有只在足够远的距离上放区间的贡献。
于是我们有了新图,把每一行都做平移可以得到:
![[Pasted image 20241107195907.png]]
其中红边权值为 1,黑边权值为 2,黄边权值为 -1,注意第 0 层也有红边,图是错的,那么答案就是 \((0,0)\) 到 \((n-m(k+1),m)\) 的所有路径权值积之和。
枚举黄边经过次数,然后发现式子就和上面的二项式反演后的结果是一样的了。
代码