zoukankan      html  css  js  c++  java
  • 模拟73 题解

    A. 小P的2048

    简单模拟。

    B. 小P的单调数列

    首先有一个简单的dp。

    设$dp_{i,j}$表示已经选择的最后一个是第$i$个数,已经有了$j$个单调段。

    转移并不困难,简单数据结构维护一下可以做到$O(n^2logn)$

    然后发现这个dp的第二维其实可以省去。

    二分答案,那么增加单调段的时候减掉二分的值即可。

    这样可以$O(nlog^2)$,其实应该可以通过。

    然而正解只有一个log。

    结论是:一定存在一个答案,只有不超过两个单调段。

    其正确性是显然的。

    设存在第三个段,那么有两种情况:

    第三个段的值大于等于前两个段的平均值,那么前两个段没有必要。

    第三个段的值小于前两个段的平均值,那么可以删掉第三个段。

    同理更多的段也是没有必要的。

    所以只要正反求最长上升子序列。

    注意离散化已经$unique$后,数组大小不再是n,不要因此挂分。

    C. 小P的生成树

    一道很好的生成树题。

    利用的思想大概是:

    在一段区间中所有边的大小关系是确定的,那么可以将这一段区间中选出一个代表元素。

    然后求出生成树即可。

    具体来说,

    当我们已经知道最大生成树的最终和,

    问题转化为如何使给定的边在该向量上的投影最大。

    然而这个向量可能有很多,无法枚举。

    于是考虑对于每个范围只枚举一个,因为每个范围中,所有边的大小关系确定,那么可以算出最终答案。

    枚举两条边,那么可以求出使这两条边投影相同的两个向量,将这些向量用角表示出来。

    对这些角排序。

    取相邻两个角中间的角,视作该区间的代表元素,算出一组答案,并尝试更新最终答案。

  • 相关阅读:
    开始学习Angular Mobile UI
    .Net程序员飞扬有用的85个工具
    数据库查询效率,百万数据测试
    SQL Join的一些总结
    MODRD 指令 读取地址是哪儿来的
    如何在不同编程语言中获取现在的Unix时间戳(Unix timestamp)?
    easyui datagrid 的分页刷新按钮
    HttpRequest Get Post,WebClient Get
    GetWindowThreadProcessId用法(转)
    EASYUI DATAGRID 多列复选框CheckBox
  • 原文地址:https://www.cnblogs.com/skyh/p/11674351.html
Copyright © 2011-2022 走看看