1006模拟题解

1006国庆模拟题解

T1

emm……

首先思考一下题目的要求。

最简单最容易想到的,应该是\(DFS\)

然鹅……

今天代码实现的时候出了大问题……

进去出不来了……

淦!

于是只能骗分,也是能想到的最简单的骗分方式。

对于每一个\(k==n-1\)而言,

显然我们只能够选择保留一座山峰。

而无论保留哪座山峰,

我们都不会积水。

也就是说,积水体积为0。

这意味着我们只需要固输\(n\)即可。

50个点,过了2个。

简直是非常绝妙的 得分 骗分手段!!!

正解:

考虑\(DP\)

\(f[i][j][p][0/1]\)表示前\(i\)列,最大值是\(j\),且要求在后面存一个高度至少为\(j\)的土地。

已经铲平了\(p\)块。

当前积水体积为奇数/偶数的方案数。

由于至多会去掉\(K\)块土地,

所以对于任意一个\(i\),\(j\)的值只有\(K+1\)种。

前缀、后缀\(DP\)都做出,

枚举最终最大值所在列合并答案,

注意处理多个最大值的情况。

时间复杂度\(P(NK^2)\)

T2

按照中序遍历和先序遍历贪心均可。

每一次检查当前点是否可以加入最终的树中,从当前点向上,每次遇到自己的左子树时,根据目前的情况计算右子树至少需要留下多少的点。

计算得到一个点留下整棵树至少多大,如果不超过\(K\),则显然可以。

由于读入的树时\(AVL\)树,树高为\(log N\)

时间复杂度\(O(NlogN)\)

T3

我有思路的另外一道题。

直接暴力模拟,可以拿到\(40\)分。

显然,最终的挖掘方案一定可以按照深度从小到大的顺序操作。

那么在操作深度为\(D\)时,

小于\(D\)的所有深度相应区间的土地一定都消失了。

由于一次操作只可能影响同一个深度的土地,

所以我们可以将每一行看成一个独立的问题,

累加答案。

剩下的问题就是如何处理一行。

一个显然的贪心是区间中最靠前的一块土地肯定要被覆盖,

最优的方式就是将其作为长度为\(K\)的区间的第一个。

我们预处理出每个位置开始的倍增数组

时间复杂度\(O(H(W+Q)logW)\)

T4

看不懂

posted @ 2020-10-08 08:22  Luo_Feng_Han  阅读(120)  评论(0编辑  收藏  举报