Euler Tour Technique
Authors: Benjamin Qi, Andi Qu
Flattening a tree into an array to easily query and update subtrees.
Introduction
Focus Problem – read through this problem before continuing!
If we can preprocess a rooted tree such that every subtree corresponds to a contiguous range on an array, we can do updates and range queries on it!
Tutorial
Resources | |||
---|---|---|---|
CPH | introduces tree traversal array, how to solve above problem |
Implementation
After running dfs()
, each range [st[i], en[i]]
contains all ranges [st[j], en[j]]
for each j
in the subtree of i
. Also, en[i]-st[i]+1
is equal to the subtree size of i
.
C++
const int MX = 2e5+5;vector<int> adj[MX];int timer = 0, st[MX], en[MX];void dfs(int node, int parent) {st[node] = timer++;for (int i : adj[node]) {if (i != parent) {dfs(i, node);}
This section is not complete.
example input
Solution - Subtree Queries
Assumes that dfs()
code is included. Uses a segment tree.
/*** Description: 1D point update, range query where \texttt{comb} is* any associative operation. If $N=2^p$ then \texttt{seg[1]==query(0,N-1)}.* Time: O(\log N)* Source:* http://codeforces.com/blog/entry/18051* KACTL* Verification: SPOJ Fenwick*/
LCA
Focus Problem – read through this problem before continuing!
Focus Problem – read through this problem before continuing!
Tutorial
Resources | |||
---|---|---|---|
CPH | |||
cp-algo |
Implementation
Resources | |||
---|---|---|---|
Benq |
C++
int n; // The number of nodes in the graphvector<int> graph[100000];int timer = 0, tin[100000], euler_tour[200000];int segtree[800000]; // Segment tree for RMQvoid dfs(int node = 0, int parent = -1) {tin[node] = timer; // The time when we first visit a nodeeuler_tour[timer++] = node;for (int i : graph[node]) {if (i != parent) {
Sparse Tables
The above code does time preprocessing and allows LCA queries in time. If we replace the segment tree that computes minimums with a sparse table, then we do time preprocessing and query in time.
Focus Problem – read through this problem before continuing!
Resources
Resources | |||
---|---|---|---|
CPH | diagrams | ||
PAPS | code | ||
cp-algo |
From CPH:
There are also more sophisticated techniques where the preprocessing time is only , but such algorithms are not needed in competitive programming.
Ex. the following:
Implementation
C++
Resources | |||
---|---|---|---|
Benq |
Problems
Status | Source | Problem Name | Difficulty | Tags | Solution |
---|---|---|---|---|---|
CSES | Normal | Show TagsEuler-Tree, PURS | |||
Gold | Normal | Show TagsEuler-Tree, PURS, HLD | |||
Gold | Normal | Show TagsEuler-Tree, LCA | External Sol | ||
Plat | Normal | Show TagsEuler-Tree, PURS | External Sol | ||
IOI | Hard | Show TagsEuler-Tree, Binary Search | External Sol | ||
Plat | Hard | Show TagsEuler-Tree, PURS | External Sol |