diff --git a/caderno/caderno.tex b/caderno/caderno.tex index 114f2b982a09bfab2da6b8b30ad7819fe0a46a1e..bf2cceef4d65c981cdee1a5c7886e99001b5d326 100644 --- a/caderno/caderno.tex +++ b/caderno/caderno.tex @@ -355,6 +355,12 @@ para $a$ e $m$ coprimos. \subsection{Menor anc. comum -- Ancensão binária} \importsource{bllca.h} +\subsection{Menor no maior} +\importsource{small-to-large.h} + +\subsection{Decomposição centróide} +\importsource{centroid.h} + \subsection{Decomposição pesado-leve} \begin{tabular}{l|l} \hline @@ -716,4 +722,7 @@ A = i + b/2 - 1 \subsection{Distância de Edição} \importsource{edit-distance.h} +\subsection{Frequência de frequêncies} +\importsource{freq-freq.h} + \end{document} diff --git a/fontes/centroid.h b/fontes/centroid.h new file mode 100644 index 0000000000000000000000000000000000000000..13c0482914e1b81ce8070589c695116f739357e4 --- /dev/null +++ b/fontes/centroid.h @@ -0,0 +1,22 @@ +vector<int> rep (N), parc (N), vis (N), sz (N); + +int calc_size(int u, int p) { + sz[u] = 1; + for (int v : g[u]) if (v != p && !vis[v]) + sz[u] += calc_size(v, u); + return sz[u]; +} + +int find_centroid(int u, int p, int n) { + for (int v : g[u]) if (v != p && !vis[v] && sz[v] > n/2) + return find_centroid(v, u, n); + return u; +} + +void centroid_decompose(int u, int p, int d = 0) { + calc_size(u, u); + int c = find_centroid(u, u, sz[u]); + vis[c] = 1; parc[c] = p; + for (int v : g[c]) if (!vis[v]) + centroid_decompose(v, c, d+1); +} diff --git a/fontes/freq-freq.h b/fontes/freq-freq.h new file mode 100644 index 0000000000000000000000000000000000000000..e21ddf0af515c4b4d06bd3ecc60ec0b5ef594b61 --- /dev/null +++ b/fontes/freq-freq.h @@ -0,0 +1,11 @@ +vector<int> hvy (N), cnt (C), freqfreq (N); +vector<ll> c (N), sumfreq (N); +int mf = 0; + +freqfreq[cnt[c[u]]]--; +if (cnt[c[u]]) { sumfreq[cnt[c[u]]] -= c[u]; } +cnt[c[u]] += x; +if (cnt[c[u]]) { sumfreq[cnt[c[u]]] += c[u]; } +freqfreq[cnt[c[u]]]++; +if (freqfreq[mf+1]) { mf++; } +if (mf > 0 && freqfreq[mf] == 0) { mf--; } diff --git a/fontes/small-to-large.cpp b/fontes/small-to-large.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e098a046ca50bf15d7bfd7aecc212fabe4bf360a --- /dev/null +++ b/fontes/small-to-large.cpp @@ -0,0 +1,28 @@ +vector<int> hvy (N); +vector<int> sz (N, 1); + +int calc_size(int u, int p) { + for (int v : g[u]) if (v != p) + sz[u] += calc_size(v, u); + return sz[u]; +} + +void dfs_add(int u, int p, int x) { + // add + for (int v : g[u]) if (v != p && !hvy[v]) + dfs_add(v, u, x); +} + +void small_large(int u, int p, bool keep) { + int mx = -1, h = -1; + for (int v : g[u]) if (v != p && sz[v] > mx) { + mx = sz[v]; h = v; + } + for (int v : g[u]) if (v != p && v != h) + small_large(v, u, 0); + if (h != -1) { small_large(h, u, 1); hvy[h] = 1; } + dfs_add(u, p, +1); + // solve queries + if (h != -1) { hvy[h] = 0; } + if (keep == 0) { dfs_add(u, p, -1); } +}