zoukankan      html  css  js  c++  java
  • 「总结」可持久化数据结构

    做了一下可持久化数据结构。
    总结一下。

    1.森林
    本身题不难。
    但是强制在线就会显得有些恶心。
    考虑启发式合并。
    用并查集维护联通性和集合大小。
    用小的合并入大的。
    每次暴力重构主席树和倍增数组。
    这样复杂度是(O(nlog^2n))的。
    重点在于用启发式合并化解复杂度。

    2.影魔
    好久以前的题了。
    现在才会。
    要求两种贡献必须都要被统计。
    考虑线段树扫描线。
    首先用单调栈维护出左右离这个数最近的大于这个数的数的位置,得到区间([L_i,R_i])
    那么有三种贡献:

    [[L_i,R_i],p1 ]

    [L_i和[i+1,R_i-1],p2 ]

    [[L_i+1,i-1]和R_i,p2 ]

    对于第一种贡献,在扫描到(R_i)的时候加入在(L_i)上。
    第二种和第三种都在扫描到定点的时候把贡献加入在区间上。
    这样对于一个询问([l_i,r_i])
    当扫描到(l_i-1)的时候在线段树上对([l_i,r_i])求和为(res_1),扫描到(r_i)的时候,再次求和为(res_2)
    那么答案就是(res2-res1)
    重点在于区分统计答案的位置。

    3.世博会
    这个题能想到我觉得还是挺爽的。
    就是切比雪夫距离转化为曼哈顿距离。
    我们旋转坐标系变为菱形就可以做了。
    转化坐标之后用主席树找到中位数是谁,就可以直接得到答案了。

    4.Obserbing the tree树上询问
    裸的可持久化树剖。
    考虑区间加一个等差数列怎么搞。
    对于左侧区间是加入原等差数列,右侧的话只需要改变首项即可,而两个等差数列相加只需要相加首项和公差。
    我们这样以来发现要打懒标记,那么用标记永久化实现,如果修改区间是子区间,那么不改变懒标记,只在当前区间加上等差数列的和。
    查询的时候将路上的标记全部累加入答案,并且将子区间的改变的和累加入答案即可。
    回溯只需要改变基态。
    本来早就(AC)了,结果对拍打错了调了半天。

    5.Alo
    这个题用(set)和可持久化(Trie)来维护。
    我们考虑某个次大值可以作为次大值更新答案的区间。
    就是这个数的位置-1到左侧第二个大于他的数的位置+1
    还有就是这个数的位置+1到右侧第二个大于他的数的位置-1
    这样我们先(sort)所有的数,然后将位置加入(set)中,然后从中找到两侧的区间端点,在(Trie)中查询,更新答案即可。
    难点在于如何找到答案的统计方法。

    6.最大异或和
    lyd原题,直接可持久化(Trie)维护就行了。

  • 相关阅读:
    【二次开发】shopxo商城
    经典的PHPer为什么被认为是草根?
    PowerDesigner生成Access数据库
    NET开发学习项目资源
    ASP.NET程序开发范例宝典
    Web.Config文件配置小记
    NET开发学习项目资源(2)
    VS 2010一步步开发windows服务(windows service)
    jquery.mobile手机网页简要
    Android置底一个View后运行报错
  • 原文地址:https://www.cnblogs.com/Lrefrain/p/12039865.html
Copyright © 2011-2022 走看看