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/5_Gold/SRQ.md
2020-06-22 10:26:06 -04:00

2.3 KiB

id title author prerequisites description
SRQ 1D Static Range Queries Benjamin Qi
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]$ where $\ominus$ denotes any associative operation.

This can be done in O(1) time each with O(N\log N) time preprocessing.

Range Minimum Query

First we'll consider the special case when \ominus denotes min.

Tutorial

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.

This data structure is known as sqrt-tree.

Problems