zoukankan      html  css  js  c++  java
  • luogu P3920 [WC2014]紫荆花之恋

    LINK:紫荆花之恋

    每次动态加入一个节点 统计 有多少个节点和当前节点的距离小于他们的权值和。

    显然我们不能n^2暴力。

    考虑一个简化版的问题 树已经给出 每次求某个节点和其他节点的贡献。

    不难想到我们直接把所有点的答案求出来 直接输出就好了 求所有点的答案 可以上点分治了树状数组维护一波就行了。

    但是现在是单点求值。不难想到动态点分治。每个分治的点存一下儿子距自己的距离由小到大排序的结果 我们在对应分治节点上二分 注意减掉自己子树内的贡献即可。

    减掉自己子树内的不妨 在每个点处维护自己的父亲到自己的点的距离可以发现 这样建树 查询 都不超过log^2

    考虑动态插入一个点 再求值。动态插入我们就需要一棵平衡树来做这个问题了。

    可以发现当插入一个点的时候 我们直接插入到对应的点分树上的父亲的下方。

    这个时候考虑重构 类似于替罪羊树 我们暴力重构点分树。

    参考替罪羊树的复杂度分析 最多重构nlogn个节点 每个节点要重构 维护点分树的形态+每个点的线段树的修改。

    复杂度nlog^3?实际远远达不到这个复杂度。

    挣扎了一下 维护线段树的话 空间和时间消耗都很大 关键是空间上的问题。

    所以点分树上每个节点下不能再吊线段树了 只能吊平衡树 考虑常数原因我们考虑替罪羊树或treap.

    可以发现外层已经有替罪羊了 内层还是替罪羊好了 题解中有位神仙给了一种替罪羊选择做法 大体上就是当发现失衡的时候就向上旋转可能在点数较少且容易失衡的时候跑的比较快吧。

    决定了 码了这道题。

  • 相关阅读:
    windows的80端口被占用时的处理方法
    Ansible自动化运维工具安装与使用实例
    Tomcat的测试网页换成自己项目首页
    LeetCode 219. Contains Duplicate II
    LeetCode Contest 177
    LeetCode 217. Contains Duplicate
    LeetCode 216. Combination Sum III(DFS)
    LeetCode 215. Kth Largest Element in an Array(排序)
    Contest 176 LeetCode 1354. Construct Target Array With Multiple Sums(优先队列,递推)
    Contest 176
  • 原文地址:https://www.cnblogs.com/chdy/p/12538493.html
Copyright © 2011-2022 走看看