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/Gold_1DRQ.md
Benjamin Qi 38f6f2dc57 1DRQ
2020-06-02 23:18:02 -04:00

3.6 KiB

Gold - 1DRQ

Author: Benjamin Qi

Binary Indexed Tree

Assumes that you are familiar with prefix sum queries (CPH 9.1).

Introduction

Given an array, the task is to update the element at a single position in addition to querying the sum of a prefix.

Sample Problems:

The easiest way to do all of these tasks is with a Binary Indexed Tree (or Fenwick Tree).

Tutorials:

My implementation can be found here, and can compute range sum queries for any number of dimensions.

Indexed Set

In the special case where all elements of the array are either zero or one (which is the case for several gold problems), users of C++ will find indexed set useful. Using this, we can solve "Inversion Counting" in just a few lines (with template).

#include <ext/pb_ds/tree_policy.hpp>
#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>; 
#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);
	}
}

Practice Problems

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.