zoukankan      html  css  js  c++  java
  • 树上莫队非详解

    做法

    树分块,像王室联邦一样
    然后怎么移动端点

    (VFK)的博客:

    用S(v, u)代表 v到u的路径上的结点的集合。
    用root来代表根结点,用lca(v, u)来代表v、u的最近公共祖先。
    那么
    S(v, u) = S(root, v) xor S(root, u) xor lca(v, u)
    其中xor是集合的对称差。
    简单来说就是节点出现两次消掉。
    lca很讨厌,于是再定义
    T(v, u) = S(root, v) xor S(root, u)
    观察将curV移动到targetV前后T(curV, curU)变化:
    T(curV, curU) = S(root, curV) xor S(root, curU)
    T(targetV, curU) = S(root, targetV) xor S(root, curU)
    取对称差:
    T(curV, curU) xor T(targetV, curU)= (S(root, curV) xor S(root, curU)) xor (S(root, targetV) xor S(root, curU))
    由于对称差的交换律、结合律:
    T(curV, curU) xor T(targetV, curU)= S(root, curV) xorS(root, targetV)
    两边同时xor T(curV, curU):
    T(targetV, curU)= T(curV, curU) xor S(root, curV) xor S(root, targetV)
    发现最后两项很爽……哇哈哈
    T(targetV, curU)= T(curV, curU) xor T(curV, targetV)
    (有公式恐惧症的不要走啊 T_T)
    也就是说,更新的时候,xor T(curV, targetV)就行了。
    即,对curV到targetV路径(除开lca(curV, targetV))上的结点,将它们的存在性取反即可。

    直接暴力取反就好了,计算答案时算上LCA,就是改一下,之后再改回去
    不带修改
    块大小为根号n
    排序
    注意要保证dfn[u]<dfn[v]
    排序时bl[A.u]==bl[B.u]?dfn[A.v]<dfn[B.v]:bl[A.u]<bl[B.u]
    bl表示属于哪一块

    带修改
    块大小为(n^{frac{2}{3}})
    排序
    v也按照块
    最后比时间

  • 相关阅读:
    开发金额处理BigDecimal
    Strtuts2.3.15 bug ,可以远程执行命令
    java 获取properies资源信息
    获取程序运行所在ip
    JVM虚拟机内存和String 类型深入
    数据库表结构上下文
    properties配置文件实现DBManager
    查询功能的包装类
    通过反射生成类的utils
    jdbc反射操作
  • 原文地址:https://www.cnblogs.com/cjoieryl/p/8724461.html
Copyright © 2011-2022 走看看