This repository has been archived on 2022-06-22. You can view files and clone it, but cannot push or open issues or pull requests.
usaco-guide/content/6_Plat/2_Plat_1DRQ.md
2020-06-09 00:01:24 -04:00

86 lines
No EOL
4.3 KiB
Markdown

---
slug: /plat/1DRQ
title: "1D Range Queries"
author: Benjamin Qi
order: 2
prerequisites:
-
- Gold - Binary Indexed Trees
---
General range queries for associative operations, including segment tree.
<!-- END DESCRIPTION -->
## Static Range Queries
Given a static array $A[1],A[2],\ldots,A[N]$, you want to answer queries in the form $A[l]\ominus A[l+1]\ominus \cdots \ominus A[r]$ in $O(1)$ time each with $O(N\log N)$ time preprocessing, where $\ominus$ denotes any associative operation. In the case when $\ominus$ denotes `min`, preprocessing can be done in $O(1)$ time.
### Tutorial
- [Range Minimum Query](https://en.wikipedia.org/wiki/Range_minimum_query)
- Use for $O(1)$ LCA
- CPH 9.1
- [cp-algorithms RMQ](https://cp-algorithms.com/sequences/rmq.html)
### Divide & Conquer
**Divide & conquer** can refer to many different techniques. In this case, we use it to answer $Q$ queries offline in $O((N+Q)\log N)$ time.
Suppose that all queries satisfiy $L\le l\le r\le R$ (initially, $L=1$ and $R=N$). Letting $M=\left\lfloor \frac{L+R}{2}\right\rfloor$, we can compute
$$lef[l]=A[l]\ominus A[l+1]\ominus \cdots \ominus A[M]$$
for all $L\le l\le M$ and
$$rig[r]=A[M+1]\ominus A[M+2] \ominus \cdots\ominus A[r]$$
for each $M< r\le R$. Then the answer for all queries satisfying $l\le M<r$ is simply $lef[l]\ominus rig[r]$ due to the associativity condition. After that, we recurse on all query intervals completely contained within $[L,M]$ and $[M+1,R]$ independently.
Actually, this can be adjusted to answer queries online in $O(1)$ time each. See my implementation [here](https://github.com/bqi343/USACO/blob/master/Implementations/content/data-structures/Static%20Range%20Queries%20(9.1)/RangeQuery.h).
See my implementation [here](https://github.com/bqi343/USACO/blob/master/Implementations/content/data-structures/Static%20Range%20Queries%20(9.1)/RangeQuery.h).
#### Problems
- [DMOJ Continued Fractions](https://dmoj.ca/problem/dmopc19c7p4)
- [USACO Plat - NonDec](http://www.usaco.org/index.php?page=viewproblem2&cpid=997)
## Segment Tree
Author: Benjamin Qi
This data structure allows you to do point update and range query in $O(\log N)$ time each for any associative operation. In particular, note that **lazy** updates allow you to range updates as well.
### Tutorials
- CPH 9.3, 28.1 (Segment Trees Revisited)
- [Codeforces Tutorial](http://codeforces.com/blog/entry/18051)
- [CSAcademy Tutorial](https://csacademy.com/lesson/segment_trees/)
- [cp-algorithms](https://cp-algorithms.com/data_structures/segment_tree.html)
- [Slides from CPC.3](https://github.com/SuprDewd/T-414-AFLV/tree/master/03_data_structures)
### Problems
- Normal SegTree
- [USACO Old Gold Seating](http://www.usaco.org/index.php?page=viewproblem2&cpid=231) (check ...)
- [USACO Old Gold Optimal Milking](http://www.usaco.org/index.php?page=viewproblem2&cpid=365) (check ...)
- [USACO Old Gold Marathon](http://www.usaco.org/index.php?page=viewproblem2&cpid=495) (check ...)
- [USACO Plat Balancing](http://www.usaco.org/index.php?page=viewproblem2&cpid=624) (check ...)
- [USACO Plat Nocross](http://www.usaco.org/index.php?page=viewproblem2&cpid=721)
- [USACO Gold Springboards](http://www.usaco.org/index.php?page=viewproblem2&cpid=995)
- can use segment tree with min query in place of the map mentioned in analysis
- [POI Cards](https://szkopul.edu.pl/problemset/problem/qpsk3ygf8MU7D_1Es0oc_xd8/site/?key=statement) [](81)
- [CSES Area of Rectangles](https://cses.fi/problemset/task/1741)
- use segment tree that keeps track of minimum and # of minimums
- Lazy Updates
- [USACO Old Gold The Lazy Cow](http://www.usaco.org/index.php?page=viewproblem2&cpid=418) (check ...)
- [USACO Plat Counting Haybales](http://www.usaco.org/index.php?page=viewproblem2&cpid=578)
## BIT Revisited
Binary Indexed Trees can support range increments in addition to range sum queries.
- [GFG Range Update Point Query](https://www.geeksforgeeks.org/binary-indexed-tree-range-updates-point-queries/)
- [GFG Range Update Range Query](https://www.geeksforgeeks.org/binary-indexed-tree-range-update-range-queries/)
- [My Implementation](https://github.com/bqi343/USACO/blob/master/Implementations/content/data-structures/1D%20Range%20Queries%20(9.2)/BITrange.h)
Example problem:
- [DMOJ Range Update Range Query](https://dmoj.ca/problem/acc3p4)