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++
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);}}en[node] = timer-1;}
Java
public static void dfs(int i, int p) {st[i] = timer++;for (int next : g[i]) {if(next != p) dfs(next, i);}en[i] = timer-1;}
This section is not complete.
Solution - Subtree Queries
Assumes that dfs()
code is included. Uses a segment tree.
C++
/*** 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*/
Java
import java.util.*;import java.io.*;public class Main {public static int[] st;public static int[] en;public static int timer, n;public static ArrayList<Integer> g[];//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++
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) {
Java
import java.util.*;import java.io.*;public class LCA {public static int[] euler_tour, tin;public static int timer, size, N;public static ArrayList<Integer> g[];//Segtree codepublic 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, HLD, PURS | ||||
Gold | Normal | Show TagsEuler-Tree, LCA | ||||
Plat | Normal | Show TagsEuler-Tree, PURS | External Sol | |||
IOI | Hard | Show TagsBinary Search, Euler-Tree | 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!