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$ 的次幂和组合数计算。

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

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

  • 相关阅读:
    关于如何Debug进MVC3源代码
    浏览文件按钮
    C#多线程学习(五) 多线程的自动管理(定时器)
    记录总数
    Json对象格式化字符串输出
    数据与通信之WebRequest.Web
    ASP.NET MVC3中的ViewBag动态性
    SQL Server 2005的XML数据修改语言(XML DML)
    SOCKET与TCP/IP与HTTP的关系
    WPF绑定方式
  • 原文地址:https://www.cnblogs.com/skyh/p/12628734.html
Copyright © 2011-2022 走看看