Блог пользователя viesis

Автор viesis, 9 лет назад, По-английски

Hello all,

I have read segment tree, lazy propagation tutorials. but I find difficult to solve some problems like this one. Can anyone give more necessary tutorials or problems links to master segment tree?

Thanks in advance.

  • Проголосовать: нравится
  • -10
  • Проголосовать: не нравится

»
9 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится

Algorithm Gym :: Everything About Segment Trees This is a very good tutorial. Enjoy it !!

»
9 лет назад, # |
Rev. 2   Проголосовать: нравится +1 Проголосовать: не нравится

That problem can be solved with a self-balancing BST in O(NlogN) or with a segment tree in O(Nlog2N) as far as I know.

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится +4 Проголосовать: не нравится

    There is a O(NlogN) solution with segment tree.

    • »
      »
      »
      9 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      You're right, I didn't give it much time. When you traverse the tree, you decide to go left or right depending on the number of elements on each interval, so it's NlogN effectively. I was actually thinking in the O(Nlog2N) solution using BIT when I said "segment tree".

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Hi, I had an idea, but I am terrible at implementation, so can you help ensuring if my approach will be correct? or Is there any valid similar approach?

    01. In the tree we will take a cnt variable where we will save how many items we have removed so far till the current position.
    02. While removing an item from position pos we will increase the cnt value by 1 from pos to end position.
    03. In the array we will always save value in their previous position(1 based index).
    04. For example let the array is A[] = {2,3,4,5,6}
    05. The cnt value in the tree is cnt[] = {0,0,0,0,0}
    06. If the query is (c,2) cnt[2] = 0; So we will print A[2+0] which is 3.Update from (2+0) to End by increasyng cnt value by 1 and set A[2+0] = -1.
    07. Now A[] = {2,-1,4,5,6} and cnt[] = {0,1,1,1,1}
    08. If the query is (a,5) we add this to the end of array.
    09. Now A[] = {2,-1,4,5,6,5} and cnt[] = {0,1,1,1,1,1}
    10. If the query is (c,3) cnt[3] = 1; So we will print A[3+1] which is 5.Update from (3+1) to End by increasyng cnt value by 1 and set A[3+1] = -1.
    11. Now A[] = {2,-1,4,-1,6,5} and cnt[] = {0,1,1,2,2,2}
    

    Thanks!

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      If at the end of all your steps, you get a query (c,3), you have cnt[3] = 1, so you will print A[3+1] = -1, while the correct answer is to print A[5]. With BIT, you would need to do O(log2N) per query, though you can achieve O(logN) using segment tree by storing in each node the total number of people in that range.

»
9 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

I think it uses order statics. Each node of segment tree can store the number of active soldiers in the line.

»
9 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

fffuuuu!

»
9 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится

You are legendary grossmeister, you must know everything about segment trees.