Algorithm 带修改的树路径查询

Algorithm 带修改的树路径查询,algorithm,tree,time-complexity,depth-first-search,lowest-common-ancestor,Algorithm,Tree,Time Complexity,Depth First Search,Lowest Common Ancestor,问题: 您将获得一个具有n个节点的树(最多可10^5个节点)和n-1个双向边。假设每个节点包含两个值: 它是索引(只是节点的一个唯一数字),假设它是从1到n 它的值是Vi,它可以从1变化到10^8 现在,在同一棵树上会有多个相同类型的查询(查询数量最多可达10^5),如下所示: 您将获得node1、node2和一个值P(可以从1到10^8不等) 对于每一种这种类型的查询,您只需找到从node1到node2的路径中的节点数,其值小于p 注意:所有节点之间将有唯一的路径,并且没有两条边属于同一对节点

问题:

您将获得一个具有n个节点的树(最多可10^5个节点)和n-1个双向边。假设每个节点包含两个值:

  • 它是索引(只是节点的一个唯一数字),假设它是从1到n
  • 它的值是Vi,它可以从1变化到10^8
  • 现在,在同一棵树上会有多个相同类型的查询(查询数量最多可达10^5),如下所示:

  • 您将获得node1、node2和一个值P(可以从1到10^8不等)
  • 对于每一种这种类型的查询,您只需找到从node1到node2的路径中的节点数,其值小于p

    注意:所有节点之间将有唯一的路径,并且没有两条边属于同一对节点

    所需的时间复杂度O(nLog(n))或可以用其他术语表示,但应在给定约束条件下在1秒内解决。

    我尝试过的:

    (A) 。如果P的值是固定的,我可以通过在每个节点存储以下信息,使用O(nLog(n))中的LCA方法轻松解决这个问题:

  • 从根节点到给定节点的值小于P的节点数
  • 但这里p的变化太大,所以这不会有帮助

    (B) 。我想的另一种方法是,使用简单的DFS。但这也需要O(nq),其中q是查询的数量。同样,因为n和q都在1到10^5之间变化,所以在给定的时间约束下,这也没有帮助

    我想不出别的什么了。任何帮助都将不胜感激。:)

    来源:

    我想我在SPOJ的某个地方读到了这个问题。但是现在找不到。尝试在Web上搜索,但在任何地方都找不到解决方案(Codeforces、CodeChef、SPOJ、StackOverflow)

  • ans(v,p)
    为从根到
    v
    的垂直路径上的答案,以及
    p
    的给定值

  • 我们怎么计算呢?有一个简单的离线解决方案:我们可以将给定节点的所有查询存储在与其相关联的向量中,运行深度优先搜索从数据结构中的路径保留当前路径上的所有值,该路径可以执行以下操作:

    • 增值
    • 删除一个值
    • 计算小于
      X
    任何平衡的二叉搜索树都可以。您可以让它变得更简单:如果您事先知道所有查询,您可以压缩这些数字,使它们位于
    [0..n-1]
    范围内,并使用二叉索引树

  • 回到原来的问题:一个
    (u,v,p)
    查询的答案显然是
    ans(v,p)+ans(u,p)-2*ans(LCA(u,v,p)

  • 就这样。时间复杂度是
    O((N+Q)log N)

    谢谢你的帮助,伙计:)你也能给我一些这样的问题链接吗?这将非常有帮助……)