Please read the new rule regarding the restriction on the use of AI tools. ×

Amiya-05's blog

By Amiya-05, history, 5 weeks ago, In English

Hello! I have come across a tree problem where number of nodes(V<=1e5) and number of edges(E<=1e5) and edge weights are given .There are Q (Q<=1e5) queries of two types:

Query 1 asks to change the weight of edge i to W (given in query) Query 2 asks to print the path length between nodes a and b (given in query)

//As I know, LCA can be used to find the distance when edge weights are not changing (But does not seem to be useful here)

Can anyone suggest any method on how to solve it efficiently ?

  • Vote: I like it
  • +4
  • Vote: I do not like it

»
5 weeks ago, # |
  Vote: I like it +11 Vote: I do not like it

Using heavy-light decomposition should be ok

»
5 weeks ago, # |
  Vote: I like it +54 Vote: I do not like it

Instead of doing HLD, you can do Euler Tour Tree+fenwick, which will work faster and will be much easier to write

  • »
    »
    5 weeks ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    How on a path? I can see it on subtree not a path

    • »
      »
      »
      4 weeks ago, # ^ |
        Vote: I like it +3 Vote: I do not like it

      Let F[u] be the sum of the weights of edges going from u to the root node

      then an update to the edge connecting node k and it's parent would change all F[v] where v is in subtree k

      with euler tour, all the v values are going to be in a range [l..r]

      to calculate distance, it's just: F[u] + F[v] — F[lca(u,v)]

  • »
    »
    4 weeks ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    Okay I will explore that too. Thanks !

»
5 weeks ago, # |
  Vote: I like it +12 Vote: I do not like it

sqrt decomposition (keep lazy updates and rebuild distance after each B queries)

»
5 weeks ago, # |
  Vote: I like it 0 Vote: I do not like it

Can't u flat the tree? the LCA with rmq in O(1), use the same logic but have a segment tree and handle edge changing withing the segment, I believe it should be fine

»
4 weeks ago, # |
  Vote: I like it 0 Vote: I do not like it

maybe sqrt decomposition will work

»
4 weeks ago, # |
  Vote: I like it +6 Vote: I do not like it

Simply change the query to the root to the vertex $$$a$$$. Then you can use DFS index and fenwick tree to solve this in $$$O(n \log n)$$$ time, which is fast enough.

  • »
    »
    4 weeks ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    Detaily, let $$$id_u$$$ be the DFS id of vertex $$$u$$$, and $$$sz_u$$$ denotes the size of the subtree rooted at vertex $$$u$$$. Note that a subtree rooted at $$$u$$$ is $$$[id_u, id_u+sz_u-1]$$$, so in fact you need to solve segment add and single point query. Use fenwick tree to solve it!