20201006day28 模拟(八)

1

problem

给定一块\(1\times N\)土地的高度,求积水体积,并求出铲除\(K\)块土地后使得所得积水体积为偶数的方案数。

solution

这个题不用求体积?
考虑dp。\(f[i][j][p][0/1]\)表示前\(i\)列,最大值是\(j\),且要求在后面存在一个高度至少j的土地,已经铲平了\(p\)块,当前积水体积为奇数/偶数的方案数。
由于至多会去掉\(K\)块土地,所以对于任意一个\(i,j\)的值只有\(K+1\)种。
前缀后缀dp都做出来之后,枚举最终最大值所在列合并答案即可。注意处理多个最大值的情况。
复杂度\(O(NK^2)\)

code

2

problem

\(\operatorname{AVL}\)

AVL树是经典的平衡二叉搜索树。定义如下:

  1. 平衡:对于任何一个点,他的左子树和右子树的高度差至少为1。树的高度定义为:根节点到子树内的点的最远距离。空子树的高度为\(-1\).
  2. 二叉搜索树:每一个点都有一个相应的权值(两两不同),任何一个点的权值都大于左子树中每个店的权值都大于左子树中每个点的权值,且小于右子树中每个点的权值。

现有一棵 \(N\) 个节点,权值为 \(1~N\) 的 AVL 树.现删掉一些节点使得最后剩下的树恰好有 \(K\) 个节点。如果删掉了一个节点,那么以这个节点为根的整棵子树都会被删掉。最后剩下的树必须依旧是一棵 AVL 树。
现在想让留下的\(K\)个节点的中序遍历的字典序最小,请输出一个01串,第\(i\)位表示权值为\(i\)的节点是否留下来。

solution

按照中序遍历和先序遍历贪心均可。
每一次检查当前点是否可以加入最终的树中,从当前点向上,每次遇到自己是左子树时,根据目前的情况计算右子树至少需要留下多少的点。计算得到一个点留下整棵树至少多大,如果不超过 \(K\),则显然可以。由于读入的树是 AVL 树,树高为\(\log N\)
时间复杂度\(O(N\log N)\)

code

3

problem

对长为\(N\)的给定的01序列,每次选择长度为\(J\)的一段,使\([L,R]\)的一段内都变成0,询问最少几次可以达到?\(Q\)组询问。

solution

贪心。区间中最靠前的一块土地肯定要被覆盖,最优的方式是把他作为区间\([i,i+J]\)的第一个。不断的做这样的操作,即可得到最少步数。
预处理出每个位置开始的倍增数组,可以在\(\log N\)内回答询问。
复杂度\(O((N+Q)\log N)\)

code

4

problem

给定两个字符串\(A,B\),分别取出长度为\(K(K\in [1,min(\operatorname{len}_A,\operatorname{len}_B)])\)的子串,比较二者字典序,较大者获胜,相等平局。求胜负平的概率各多少。

solution

由于长度为\(K\)对应的总方案数是确定的,所以我们就是要计算三种情况的数量。记\(A,B\)串的长度分别为\(S_A,S_B\),取出的子串长度分别为\(X,Y\)
考虑计算\(X\le Y\)的方案数,考虑对串\(A\#B\)构建后缀数组,对于每一个属于\(A\)的后缀,排在他后面的属于\(B\)的后缀和它的贡献和它产生的攻坚是\(1-\min(X,Y)\)长度的答案+1.
暴力。从后往前,遇到B的后缀时,将\(1-S_A\)的贡献都加进\(1-S_A\)的答案中去。
对于A后缀,在他前面的B后缀的贡献是\(\operatorname{lcp}(S_A,S_B)\)的答案+1.考虑类似的暴力,从后往前遇到B后缀时,将\(1-S_B\)的贡献均+1,遇到A后缀时,将\(1-S_A\)的贡献都加进\(1-S_A\)的答案中去。
to be continued...
\( \begin{gathered} \quad \begin{pmatrix} 0 & -i \\ i & 0 \end{pmatrix} \quad \end{gathered} \)

code

posted @ 2020-10-06 13:25  刘子闻  阅读(230)  评论(0编辑  收藏  举报