Euler Tour Technique
Authors: Benjamin Qi, Andi Qu, Andrew Wang
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 | ||
SecondThread |
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++
1const int MX = 2e5+5;2vector<int> adj[MX];3int timer = 0, st[MX], en[MX];45void dfs(int node, int parent) {6 st[node] = timer++;7 for (int i : adj[node]) {8 if (i != parent) {9 dfs(i, node);10 }
Java
1public static void dfs(int i, int p) {2 st[i] = timer++;3 for (int next : g[i]) {4 if(next != p) dfs(next, i);5 }6 en[i] = timer-1;7}
This section is not complete.
example input
Solution - Subtree Queries
Assumes that dfs()
code is included. Uses a segment tree.
C++
1/**2 * Description: 1D point update, range query where \texttt{comb} is3 * any associative operation. If $N=2^p$ then \texttt{seg[1]==query(0,N-1)}.4 * Time: O(\log N)5 * Source:6 * http://codeforces.com/blog/entry/180517 * KACTL8 * Verification: SPOJ Fenwick9 */10
Java
1import java.util.*;2import java.io.*;34public class Main {5 public static int[] st;6 public static int[] en;7 public static int timer, n;8 public static ArrayList<Integer> g[];910 //Segtree code
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++
1int n; // The number of nodes in the graph2vector<int> graph[100000];3int timer = 0, tin[100000], euler_tour[200000];4int segtree[800000]; // Segment tree for RMQ56void dfs(int node = 0, int parent = -1) {7 tin[node] = timer; // The time when we first visit a node8 euler_tour[timer++] = node;9 for (int i : graph[node]) {10 if (i != parent) {
Java
1import java.util.*;2import java.io.*;34public class LCA {5 public static int[] euler_tour, tin;6 public static int timer, size, N;7 public static ArrayList<Integer> g[];89 //Segtree code10 public static final int maxsize = (int)1e7; // limit for array size
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 | URL |
---|---|---|---|---|---|---|
CSES | Normal | Show TagsEuler-Tree, PURS | ||||
Gold | Normal | Show TagsEuler-Tree, PURS, HLD | ||||
Gold | Normal | Show TagsEuler-Tree, LCA | ||||
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 | |||
DMOJ | Very Hard | Show TagsEuler-Tree, PURS | Check DMOJ |
Module Progress:
Join the USACO Forum!
Stuck on a problem, or don't understand a module? Join the USACO Forum and get help from other competitive programmers!