• 省选模拟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$ 的次幂和组合数计算。

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

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

  • 相关阅读:
    从一道比较奇葩的笔试题说起
    如何用一个语句判断一个整数是不是二的整数次幂——从一道简单的面试题浅谈C语言的类型提升(type promotion)
    C指针(转)
    raspberry-常用命令
    raspberry-同路由器用putty和vnc桌面登录方法
    结对编程-黄金点游戏
    软件工程第一次作业
    Python机器学习(9)——聚类算法之K均值
    Python机器学习(8)——推荐算法之推荐矩阵
    Python机器学习(7)——SVM支持向量机
  • 原文地址:https://www.cnblogs.com/skyh/p/12628734.html
Copyright © 2020-2023  润新知