Update Gold_1DRQ.md

This commit is contained in:
Benjamin Qi 2020-06-02 23:42:17 -04:00 committed by GitHub
parent 612491bf11
commit 8b6ed08b70
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,30 +1,32 @@
# Gold - 1DRQ
# Gold - 1D Range Queries
Author: Benjamin Qi
## Binary Indexed Tree
## Prerequisites
Assumes that you are familiar with prefix sum queries (CPH 9.1).
## Binary Indexed Tree
### Introduction
Given an array, the task is to update the element at a single position in addition to querying the sum of a prefix.
Given an array of size $N$, the task is to update the element at a single position (point) in addition to querying the sum of a prefix in $O(\log N)$ time each.
Sample Problems:
* [CSES Range Sum Queries II](https://cses.fi/problemset/task/1648)
* [CSES Range XOR Queries](https://cses.fi/problemset/task/1650)
* essentially the same as above
* [SPOJ Inversion Counting](https://www.spoj.com/problems/INVCNT/)
The easiest way to do all of these tasks is with a **Binary Indexed Tree** (or Fenwick Tree).
Tutorials:
* CPH (very good)
* Section 9.2
* CPH 9.2 (very good)
* [CSAcademy BIT](https://csacademy.com/lesson/fenwick_trees) (also very good)
* [cp-algorithms Fenwick Tree](https://cp-algorithms.com/data_structures/fenwick.html)
* extends to range update range query, although this is not necessary for gold
* extends to range increment and range query, although this is not necessary for gold
* [Topcoder BIT](https://www.topcoder.com/community/data-science/data-science-tutorials/binary-indexed-trees/)
My implementation can be found [here](https://github.com/bqi343/USACO/blob/master/Implementations/content/data-structures/1D%20Range%20Queries%20(9.2)/BIT%20(9.2).h), and can compute range sum queries for any number of dimensions.
@ -38,50 +40,69 @@ In the special case where all elements of the array are either zero or one (whic
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
template <class T> using Tree = tree<T, null_type, less<T>,
rb_tree_tag, tree_order_statistics_node_update>;
rb_tree_tag, tree_order_statistics_node_update>;
#define ook order_of_key
#define fbo find_by_order
int main() {
setIO();
int T; re(T);
F0R(i,T) {
int n; re(n);
Tree<int> T; ll numInv = 0;
F0R(j,n) { // T.ook(x+1) gives number of previous elements < (x+1)
int x; re(x); numInv += j-T.ook(x+1); // so this gives # previous elements > x
T.insert(x);
}
ps(numInv);
}
setIO();
int T; re(T);
F0R(i,T) {
int n; re(n);
Tree<int> T; ll numInv = 0;
F0R(j,n) {
int x; re(x); // T.ook(x+1) gives number of previous elements < (x+1)
numInv += j-T.ook(x+1); // so this gives # previous elements > x
T.insert(x);
}
ps(numInv);
}
}
```
### Practice Problems
* USACO Gold
* The first three problems are just small variations on inversion counting.
* The first three problems are just variations on inversion counting.
* [Haircut](http://www.usaco.org/index.php?page=viewproblem2&cpid=1041)
* [Balanced Photo](http://www.usaco.org/index.php?page=viewproblem2&cpid=693)
* [Circle Cross](http://www.usaco.org/index.php?page=viewproblem2&cpid=719)
* [Sleepy Cow Sort](http://usaco.org/index.php?page=viewproblem2&cpid=898)
* as far as I know, all gold problems have had only one possible output ...
* [Out of Sorts (harder?)](http://www.usaco.org/index.php?page=viewproblem2&cpid=837)
* Other Problems:
* [Sorting Steps](https://csacademy.com/contest/round-42/task/sorting-steps/) [](42)
* I think this was a silver problem??
* [Cards](https://szkopul.edu.pl/problemset/problem/qpsk3ygf8MU7D_1Es0oc_xd8/site/?key=statement) [](81)
* [Mega Inversions](https://open.kattis.com/problems/megainversions)
* also just inversion counting
* [Out of Sorts (USACO Silver)](http://usaco.org/index.php?page=viewproblem2&cpid=834)
* aka [Sorting Steps](https://csacademy.com/contest/round-42/task/sorting-steps/) [](42)
* Of course, this doesn't require anything other than sorting but fast range sum queries may make this easier.
## Segment Tree + Related (update later?)
## Beyond Summation
Segment trees allow you to perform any associative operation over ranges, not just summation or XOR. Although not required for any USACO gold problems, it can still be helpful.
The following topics have not been required for gold (so far).
* Range Minimum Query??
### Static Range Queries
* Range Minimum Query
* Tutorial
* [Wikipedia](https://en.wikipedia.org/wiki/Range_minimum_query)
* Segment Tree
* Tutorial
* [CPC.3](https://github.com/SuprDewd/T-414-AFLV/tree/master/03_data_structures)
* [CSAcademy Tutorial](https://csacademy.com/lesson/segment_trees/)
* [Codeforces Tutorial](http://codeforces.com/blog/entry/18051)
* (add)
* Static range queries in $O(1)$ time and $O(N\log N)$ preprocessing for any associative operation?
* (add)
### Segment Tree
This data structure allows you to do point update and range query in $O(\log N)$ time each for any associative operation.
* Tutorial
* CPH 9.3
* [CSAcademy Tutorial](https://csacademy.com/lesson/segment_trees/)
* [cp-algorithms](https://cp-algorithms.com/data_structures/segment_tree.html)
* [Codeforces Tutorial](http://codeforces.com/blog/entry/18051)
* [Slides from CPC.3](https://github.com/SuprDewd/T-414-AFLV/tree/master/03_data_structures)
* Problems
* [USACO Springboards](http://www.usaco.org/index.php?page=viewproblem2&cpid=995)
* can use segment tree with min query
* 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)
* [Counting Haybales (USACO Plat)](http://www.usaco.org/index.php?page=viewproblem2&cpid=578)
* lazy updates