• 模拟63 题解


    A. Median

    线性筛完质数,就会发现给的时间已经快没了。

    所以只能$O(n)$求$n-k$个中位数?

    不会做,所以打权值线段树。

    在权值线段树上二分找第k大值,可以做到$O(nlogn)$。

    打$zkw$线段树,比传统线段树快一倍,然而并没有什么用,仍然T70。

    题中确实给出了一些特殊性质:

    模数小于区间长度小于$n$。

    看似奇怪,却很有道理。

    在本题几乎随机的数据下,每次中位数的变化量一定是不大的。

    用一个桶维护当前区间每个权值的个数。

    所以用一个指针不断继承左侧权值的个数,

    不断尝试移动找中位数就可以了。

    B. Game

    本来以为是一道博弈论题。

    突然发现有点奇怪,先手每个不同的策略转向相同的结果,即右区间加一,后手继续选。

    所以最优策略一定是各自选最大的数。

    堆优化可以做到$O(nmlogn)$。

    然后就是一个显然正确但想不到的优化。

    因为本题中保证权值不超过$n$,所以可以先将给定的权值放进桶中。

    一个单调指针从大往小扫,对于桶中每一个元素:

    删去这个元素,

    如果新加入的元素大于当前指针,那么不断继续删除新加入的元素。

    否则直接入桶。

    C. Park

    观察特殊测试点,可以发现。

    暴力枚举起点,$O(n^2v)$的$dp$可以得到70分。

    设$f[x][i]$表示从枚举的起点到$x$,总共用了$i$个面包屑。

    设$s_x$表示与$x$相连的点的权值和,$w_x$表示点$x$的权值。

    那么有$f[x][i]=max(f[from][i],f[from][i-1]+s_x-w_{from})$

    考虑优化这个枚举起点的$dp$,

    对于任意一个有序点对$(a,b)$,即对应$a ightarrow b$的方案,可以在它们的$lca$处合并两个状态,即$dp_{a ightarrow lca}+dp_{lca ightarrow b}$。

    然而并不是所有的点对都有用。

    对于同一个$lca$的同一个权值$i$,只关注最优的上来的路径,即$f[lca][i][0]$,

    和最优的下去的路径,即$f[lca][i][1]$,在$lca$处尝试合并这两条路径就可以了。

    仿照上一个暴力算法的$dp$,转移是简单的。

    需要注意的是,有一些打法只能合并原有的上来路径和当前的下去路径来更新答案,所以$dp$需要再倒着做一遍。

  • 相关阅读:
    fis3解决web网站缓存问题
    C# 计算每周和每月固定日期
    移动端web页面上滑加载更多功能
    常见三种字符编码的区别:ASCII、Unicode、UTF-8
    ef AddDays报错
    .NET语言的编译过程:中间语言(IL)和即时编译器(JIT)
    ajax 传递数组类型参数后台接收不到的问题
    sql server 作业没跑、开启sql 代理服务、新建作业
    在javascript中NodeList和Array的区别及转换方法
    我经历的几种开发模式和心理
  • 原文地址:https://www.cnblogs.com/skyh/p/11631011.html
Copyright © 2020-2023  润新知