More Applications of Segment Tree
Authors: Benjamin Qi, Andi Qu
Prerequisites
Walking on a Segment Tree, Non-Commutative Combiner Functions
Resources | |||
---|---|---|---|
CF | both of these topics | ||
cp-algo | Includes these two applications and more. |
Walking on a Segment Tree
Focus Problem – read through this problem before continuing!
You want to support queries of the following form on an array (along with point updates).
Find the first such that .
Of course, you can do this in time with a max segment tree and binary searching on the first such that . But try to do this in time.
Solution - Hotel Queries
Solution
Problems
Status | Source | Problem Name | Difficulty | Tags | Solution | URL |
---|---|---|---|---|---|---|
Old Gold | Normal | External Sol | ||||
Plat | Normal | External Sol |
Non-Commutative Combiner Functions
Previously, we only considered commutative operations like +
and max
. However, segment trees allow you to answer range queries for any associative operation.
Focus Problem – read through this problem before continuing!
Focus Problem – read through this problem before continuing!
Solution - Point Set Range Composite
The segment tree from the prerequisite module should suffice. You can also use two BITs as described here, although it's more complicated.
1using T = AR<mi,2>;2T comb(const T& a, const T& b) { return {a[0]*b[0],a[1]*b[0]+b[1]}; }34template<class T> struct BIT {5 const T ID = {1,0};6 int SZ = 1; V<T> x, bit[2];7 void init(int N) {8 while (SZ <= N) SZ *= 2;9 x = V<T>(SZ+1,ID); F0R(i,2) bit[i] = x;10 FOR(i,1,N+1) re(x[i]);
Solution - Subarray Sum Queries
Hint: In each node of the segment tree, you'll need to store four pieces of information.
Solution
Problems
Status | Source | Problem Name | Difficulty | Tags | Solution | URL |
---|---|---|---|---|---|---|
Old Gold | Easy | External Sol | ||||
Old Gold | Normal | External Sol | ||||
POI | Normal | View Solution | ||||
Plat | Hard | Show TagsPURQ, Greedy | External Sol | |||
Balkan OI | Hard |
Module Progress:
Join the USACO Forum!
Stuck on a problem, or don't understand a module? Join the USACO Forum and get help from other competitive programmers!