<span>省选模拟60 题解</span>

A. 摧毁图状树

考虑一个暴力做法。

维护一个堆,每次取出深度最大的点,如果他还没有覆盖,那么就给答案增加 $1$。

否则直接跳过,然后直接跳到他的 $k$ 级祖先加入堆中,复杂度是 $O(n^2log)$ 的。

然后发现这样一个事情,这个复杂度肯定是不满的。

比如说对于单次操作,复杂度大概就是答案大小 $*log$ 级别的。

考场上大概想到了这里,然后没猜到结论就没了。

设叶子的个数是 $L$,有一个结论是答案的大小大概是 $L+\frac{n}{k}$ 级别的。

证明的方法大概是考虑除掉了这些关键点,剩下每个连通块的大小至少为 $k$。

对于后者 $\frac{n}{k}$ ,因为调和级数所以可以直接暴力。

问题是咋处理叶子的贡献。

然后很神仙的一个办法是,直接统计叶子的答案,然后把距离最近的叶子距离恰好为 $k$ 的节点塞入 $k$ 对应的堆。

对于覆盖问题,其实用一个树状数组来搞一下就好了。

特别的,需要特判一个点是否被叶子覆盖,这个直接用前面预处理出的数组就好了。

 

B. 排列统计

首先可以把这个期望通过期望的线性性展开。

然后问题就摊到了每个数前面没有比他大的数的概率。

这个直接搞一个 $0/1$ 序列出来就可以暴力了。

然后一个优化的想法,其实并不关注具体的位置是啥,只要知道左侧右侧有多少个 $0/1$ 就可以转移了。

然后发现还真转移不了,因为对于当前考虑数的交换,没办法确定一步之后的状态。

然后就挂了。

正解是这样的,其实可以再枚举一下当前考虑数最终的位置在哪里。

然后记录最终位置左右的 $0$ 的个数,当前考虑数在最终位置的左、中、右,最终位置上的数大于、小于当前考虑数即可。

 

C. 归并排序

考试时还是没仔细分析。

经过分析可以得知,如果一个数对是正常顺序,那么就正常排序下去。

如果一个点对是逆序的,那一定是大的之后小的马上出现。

然后可以讨论一个点对 $(a,b),a<b$ 对当前点 $x$ 在排名上的贡献。

如果 $b<x$ ,那么贡献一定为 $2$。

如果 $x<a$ ,那么贡献一定为 $0$。

否则 $x$ 夹在中间,贡献为 $0$ 或 $1$。

然后每个点对的贡献都是独立的,所以可以直接用 $2$ 的次幂和组合数计算。

前两者用树状数组即可维护,然后一减就可以得到最后一个。

然后对于每次询问,讨论一下当前这个询问的点对是正序的还是逆序的即可。

全部评论

相关推荐

10-13 17:47
门头沟学院 Java
wulala.god:图一那个善我面过,老板网上找的题库面的
点赞 评论 收藏
分享
冲芭芭拉鸭:你这图还挺新,偷了。
投递美团等公司10个岗位
点赞 评论 收藏
分享
11-24 11:23
门头沟学院 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务