Hi, I’d like to introduce a simple trick about segment tree in this blog as I promised in this comment. Sorry for the long delay, as a sophomore in Peking University, I've just finished a tired semester and a painful final exam. And now I finally have enough time to do a simple introduction to this interesting algorithm.
It may be a huge project for me since my English is not good. I think I will finish this blog in several steps and I will try to finish it as soon as possible :)
In China, all of the 15 candidates for the Chinese National Team are asked to write a simple research report about algorithms in informatics Olympiad, and the score will be counted in the final selection. There are many interesting ideas and algorithms in these reports. And I find that some of them are quite new for competitors in CF although they are well known in China from the final standings of some recent contests. For example, In the last contest CF Round #458, the problem G can be easily solved using set power series (I don’t know how to describe it in English so I just use the phrase given by Baidu translate) in O(2nn2) which was imported in China by vfleaking in 2015.
This blog is about my report which is written about two years ago. I am satisfied with this work although there is a flaw about time complexity. xyz111 gave me a lot of inspiration, and the name “Segment tree beats” is given by C_SUNSHINE which is from a famous Japanese anime “Angel Beats”.
Here is the link about the Chinese version of this report.
Part1. What it can do.
This work have two part:
- Transform interval max/min (for ) operations into interval add/minus operations in O(1) or
- Transform history max/min/sum queries into interval max/min operations in O(1).
Here are some sample problems I used in my report. At first you have a array A of length n and two auxiliary arrays B, C. Initially, B is equal to A and C is all zero.
Task 1. There are two kinds of operations:
- For all , change Ai to max(Ai, x)
- Query for the sum of Ai in [l, r]
It can be solved in
Task 2. We can add more operations to Task 1:
- For all , change Ai to max(Ai, x)
- For all , change Ai to min(Ai, x)
- For all , change Ai to Ai + x, x can be a negative number
- Query for the sum of Ai in [l, r]
It can be solved in and I could not proved the exact time complexity yet, maybe It is still ;)
Task 3. And we can query for some other things:
- For all , change Ai to max(Ai, x)
- For all , change Ai to min(Ai, x)
- For all , change Ai to Ai + x, x can be a negative number
- Query for the sum of Bi in [l, r]
After each operation, for each i, if Ai changed in this operation, add 1 to Bi.
It’s time complexity is the same as Task 2.
Task 4. We can also deal with several arrays synchronously. Assume there are two arrays A1 and A2 of length n.
- For all , change Aa, i to min(Aa, i, x)
- For all , change Aa, i to Aa, i + x, x can be a negative number
- Query for the max A1, i + A2, i in [l, r]
It can be solved in and if there are k arrays, the time complexity will be raised to .
Task 5. And there are some tasks about history informations.
- For all , change Ai to Ai + x, x can be a negative number.
- Query for the sum of Bi in [l, r].
- Query for the sum of Ci in [l, r]
After each operation, for each i, change Bi to max(Bi, Ai) and add Ai to Ci.
The query for Bi can be solved in and the query for Ci can be solved in .
Task 6. We can even merged the two parts together.
- For all , change Ai to max(Ai, x)
- For all , change Ai to Ai + x, x can be a negative number.
- Query for the sum of Bi in [l, r].
After each operation, for each i, change Bi to min(Bi, Ai).
It can be solved in .
There are 11 sample tasks in my report and here are 6 of them. All of them are interesting and are hard to solve using the traditional techniques such as lazy tags.
In the next update, I suppose to introduce the main idea of this trick without the prove of the time complexity. Since I’m traveling in Harbin and the temperature of thirty degrees below zero makes me really tired, I want to go to rest early. Sorry for the interruption and I’ll try to finish the rest part as soon as possible :)