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
Benjamin Qi af73a84163 lots
2020-06-22 22:17:59 -04:00

2.5 KiB

id title author description
SRQ Static Range Queries Benjamin Qi Range queries for any associative operation over a static array.

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.

A data structure known as sqrt-tree can speed up preprocessing time to O(N\log \log N).

Problems