zoukankan      html  css  js  c++  java
  • 省选模拟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$ 的次幂和组合数计算。

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

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

  • 相关阅读:
    【SignalR学习系列】3. SignalR实时高刷新率程序
    【SignalR学习系列】4. SignalR广播程序
    【SignalR学习系列】5. SignalR WPF程序
    python gb2312 转换为 utf-8
    爬虫 需要什么样的 CPU,内存 和带宽
    TypeError: sequence item 0: expected string, Tag found
    MySQL 数据的 截取,数据清洗
    MySQL (1366, "Incorrect string value: '\xF0\x9F\x8E\xAC\xE5\x89...' for column 'description' at row 1")
    微博爬虫 ----- 微博发布时间清洗
    ReferenceError: weakly-referenced object no longer exists Python kafka
  • 原文地址:https://www.cnblogs.com/skyh/p/12628734.html
Copyright © 2011-2022 走看看