省选模拟60 题解
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$ 的次幂和组合数计算。
前两者用树状数组即可维护,然后一减就可以得到最后一个。
然后对于每次询问,讨论一下当前这个询问的点对是正序的还是逆序的即可。