zoukankan      html  css  js  c++  java
  • 12.30模拟赛

    我好菜啊

    又双叒叕垫底辣

    其实题目并不难

    不光是度把握不好,而且T1,T2还是没有抓住题目的性质,(性质才是关键啊)

    (其实大部分题不会做都是因为没有抓住题目的性质。。)

    T1:

    一个显而易见的结论是,两人一定从S中选择最大的一个取走

    一个显而易见的复杂度是O(NK)
    一个显而易见的暴力是模拟一遍用堆维护O(NKlogN)
    另一个显而易见的暴力是用一个桶维护出现次数和最大值,然后暴力更新mx.O(N^2K)

    没有别的办法了吗?

    桶的mx指针往下跳是O(N),因为可能往上跳,

    我们其实并不需要桶的指针来回跳,

    如果新加入的值大于mx,那么一定就取这个值,对mx无影响

    而小于mx,就放进桶,然后取出一个mx。然后mx向下走更新

    这样,mx单调递减。

    O(NK)+卡常

    其实这个题就是优化一下暴力,排除冗余的更新

    T2:

    考虑树形dp

    链竖直,所以考虑f[x]表示x根子树,x作为一条链的上端最大值

    O(N^2)可以dfs套dfs

    不暴力dfs的话,要考虑能否在儿子链的基础上接上自己

    但是直接做不行的,因为最大最小值都不知道是多少。

    如果最大最小值在特殊位置,那么会很容易处理。

    经过一些观察发现

    一条链一定两端最大最小值,而且中间单调!

    否则劈成两半或多半一定更优!

    所以我们dp转移的时候,不用找整个链

    dp[x][0/1]表示x为根的子树,x作为链的顶端是最大值还是最小值的最大总和

    要么不作为开端,要么和子树连接。

    由于本身是最值,儿子本身也是最值,所以可以直接把贡献得到。

    O(N)

    启发我们:

    当题目数据范围和算法有了矛盾的时候,第一反应不是套高级数据结构暴力搞一搞

    而是应该尝试发现题目的性质,简化不必要的过程

    这两个题都是在题目性质的基础上优化暴力。

    上次的主席树维护AC自动机儿子指针也是这样。

    以后还是要打起精神,努力发掘题目性质,尝试换一种思维等等。

    这比套用高级算法有意义的多。

  • 相关阅读:
    iOS 开发中的坑与相关技巧
    SDK 封装的相关看法
    线程问题---在iPad上会崩溃,在iPhone上不会崩溃
    添加新手引导页需要注意的几个小点
    iOS 七牛云上传并获取图片----【客户端】
    iOS 线程相关-----绝对de干货
    Vue.js 基础示例
    lib-flexible 结合 WKWebView 的样式错乱解决方法
    基于CommentCoreLibrary简单的弹幕实现
    页面上动态编译及执行java代码
  • 原文地址:https://www.cnblogs.com/Miracevin/p/10199643.html
Copyright © 2011-2022 走看看