Counting Minimums with Segment Tree
Authors: Benjamin Qi, Dustin Miao
Querying for the minimum and number of occurences of minimum in a range
Prerequisites
Focus Problem – try your best to solve this problem before continuing!
Resources | ||||
---|---|---|---|---|
cp-algo |
We would like a data structure that can efficiently handle two types of operations:
- Update index to value
- Report the minimum and the number of occurences of the minimum on a range
We can use a normal segment tree to handle range queries, but slightly modify each node and the merge operation. Let each node be a pair of values , where is the minimum value and is the number occurences of the minimum value.
If node has two children and , then
- if , then
- if , then
- if , then
Implementation
C++
const int MAXN = 2e5;struct Node {int val = INT32_MAX, cnt = 1;} tree[2 * MAXN];// combines two segment tree nodesNode merge(Node a, Node b) {if (a.val < b.val) {return a;
Solution - Area of Rectangles
Hint 1
Hint 2
We can use techniques introduced in Range Queries with Sweep Line
We sweep from left to right over the -coordinates, maintaining two events for each rectangle: one for the left boundary and one for the right boundary. Maintain a Lazy Segment Tree over the -coordinates.
- When we run into a left boundary of some rectangle with -coordinates , increase each index by 1
- When we run into a right boundary of some rectangle with -coordinates , decrease each index by 1
Then, for each , we simply need to count the number of non-zero indices which corresponds to indices that are covered by at least one rectangle. How can we do this?
Instead of counting the area covered by at least one rectangle, let's count the amount of space covered by no rectangles. We can subtract this amount from the total number of indices to get the value we want.
We can use a Segment Tree that counts the number of occurences of the minimum value. Because the minimum value is at least zero (there can't be a negative number of rectangles at a position) the number of uncovered squares is equal to the number of squares with value 0.
Implementation
C++
#include <bits/stdc++.h>using namespace std;const int MAXX = 1e6;const int MAXN = 2 * MAXX + 1;struct Event {int t, x, y0, y1;// t = 1 for left bound, -1 for right boundbool operator<(const Event &e) { return x < e.x; }
Problems
Status | Source | Problem Name | Difficulty | Tags | |
---|---|---|---|---|---|
CF | Easy | Show TagsDP | |||
mBIT | Normal | ||||
IOI | Hard | ||||
HR | Hard | Show TagsLazy SegTree | |||
CF | Very Hard |
Optional: Permutation Tree
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!