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

    C 李超树模板题。
    注意eps。
    B 这是我认为最有价值的题目。
    本人思考了很久才得出此题正确解法。(其实走了很多弯路)
    首先,猜一个结论:合法的段数不多。
    这个结论是错的。因为如果a[i]单调递减,则段数可以达到n^2级别。
    但是这给了我们一些启示。
    考虑如何求出每一个合法的,以某一个元素为右端点额,第一类段。可以使用单调栈。
    当栈顶的元素>当前元素,不断删除栈顶元素,再把当前元素插入栈。
    设lv[i]表示i左边第一个>a[i]的元素,
    栈内下标>lv[i]的元素就是以当前点结尾所形成的合法段。
    注意到一个性质:如果设ri[j]表示扫至当前点i,以j为左端点的最长区间。则查询[l,i]的ri最大值就是答案。
    考虑扫描线,每个询问区间挂在右端点上。
    如果可以正确更新ri,就可以正确回答询问。
    问题变成要维护一个数据结构,支持如下操作:
    1.把所有有标记且权值>v的元素与一个值取max。
    2.加入/移除一个标记
    3.查询区间的i-ri[i]+1最小值
    如果建出单调栈的树(uoj430),是不可做的
    因为在更新树的值时还要维护对应标号的值。不可避免要嵌套数据结构
    本人思考了这个算法很久,最后才发现不行。
    可以使用两个线段树,一个维护已经出单调栈的答案,一个维护单调栈内的答案。
    在弹栈时,在第二个线段树上查询值,在第一个上修改。
    在更新答案时,找到对应位置,在第一个线段树区间赋值。
    时间复杂度nlogn
    由于数据水,使用单调栈深度有关做法也能过。本人在考试时写了这个做法,由于忽略了一个限制所以只拿了5分。
    A
    wys论文题。
    建立点双树。
    对于每一个圆点,拿到子树的最长链+次长链更新答案。
    对于方点,要计算出环上的最长链以更新这个点的父亲。
    以这个环为中心合并答案。
    我们要求如下式子的最大值:f[i]+f[j]+min(sz-i+j,i-j)
    通过钦定只取右边,破环为链,倍长链即可计算。
    最后在算完这个方点后,要把他的答案来更新方点的父亲。
    总结:一场思维难度和提高组day2相近的比赛。

  • 相关阅读:
    另一种遍历Map的方式: Map.Entry 和 Map.entrySet()
    mycat 插入语句导致的一个Dobbo问题
    Json数据处理
    List与字符串转换
    MySQL中四舍五入的实现
    java连接mysql :No Suitable Driver Found For Jdbc 解决方法
    Linux中printf格式化输出
    bat隐藏文件夹
    Python 3.5.2建立与DB2的连接
    Python 爬虫实例
  • 原文地址:https://www.cnblogs.com/ctmlpfs/p/13624718.html
Copyright © 2011-2022 走看看