Max Suffix Query with Insertions Only
Author: Benjamin Qi
A solution to USACO Gold - Springboards.
Note: This was originally in Gold, but the practice problems were too hard ...
Focus Problem – try your best to solve this problem before continuing!
To solve this problem, we need a data structure that supports operations similar to the following:
- Add a pair .
- For any , query the maximum value of over all pairs satisfying .
This can be solved with a segment tree, but a simpler option is to use a map. We rely on the fact that if there exist pairs and in the map such that and , we can simply ignore (and the answers to future queries will not be affected). So at every point in time, the pairs that we store in the map will satisfy and .
- Querying for a certain can be done with a single
lower_bound
operation, as we just want the minimum such that . - When adding a pair , first check if there exists already in the map such that .
- If so, then do nothing.
- Otherwise, insert into the map and repeatedly delete pairs such that from the map until none remain.
If there are insertions, then each query takes time and adding a pair takes time amortized.
Implementation
C++
#define lb lower_boundmap<int, ll> m;void ins(int a, ll b) {auto it = m.lb(a);if (it != end(m) && it->s >= b) return;it = m.insert(it, {a, b});it->s = b;while (it != begin(m) && prev(it)->s <= b) m.erase(prev(it));}ll query(int x) {auto it = m.lb(x);return it == end(m) ? 0 : it->s;}// it = end(m) means that no pair satisfies a >= x
You can check the analysis for the full solution to the original problem.
Warning!
"Maximum second element" should be "minimum second element" in the analysis.
Problems
Status | Source | Problem Name | Difficulty | Tags | |
---|---|---|---|---|---|
COCI | Easy | Show TagsPURQ | |||
Platinum | Hard | Show TagsPURQ | |||
CF | Very Hard | Show TagsPURQ | |||
CF | Very Hard | Show TagsPURQ | |||
CF | Very Hard | Show TagsPURQ |
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!