Codeforces 191C Fools and Roads(树链剖分)
2014-10-17 18:47
447 查看
题目链接:Codeforces 191C Fools and Roads
题目大意:给定一个N节点的数,然后有M次操作,每次从u移动到v,问说每条边被移动过的次数。
解题思路:树链剖分维护边,用一个数组标记即可,不需要用线段树。
题目大意:给定一个N节点的数,然后有M次操作,每次从u移动到v,问说每条边被移动过的次数。
解题思路:树链剖分维护边,用一个数组标记即可,不需要用线段树。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1e5 + 5; int N, Q, ne, first[maxn], f[maxn], jump[maxn * 2]; int id, idx[maxn], top[maxn], far[maxn], son[maxn], dep[maxn], cnt[maxn]; struct Edge { int u, v; void set (int u, int v) { this->u = u; this->v = v; } }ed[maxn * 2]; void dfs (int u, int pre, int d) { far[u] = pre; dep[u] = d; cnt[u] = 1; son[u] = 0; for (int i = first[u]; i + 1; i = jump[i]) { int v = ed[i].v; if (v == pre) continue; dfs(v, u, d + 1); cnt[u] += cnt[v]; if (cnt[son[u]] < cnt[v]) son[u] = v; } } void dfs(int u, int rot) { top[u] = rot; idx[u] = ++id; if (son[u]) dfs(son[u], rot); for (int i = first[u]; i + 1; i = jump[i]) { int v = ed[i].v; if (v == far[u] || v == son[u]) continue; dfs(v, v); } } inline void add_Edge(int u, int v) { ed[ne].set(u, v); jump[ne] = first[u]; first[u] = ne++; } void init () { int u, v; ne = id = 0; memset(first, -1, sizeof(first)); scanf("%d", &N); for (int i = 1; i < N; i++) { scanf("%d%d", &u, &v); add_Edge(u, v); add_Edge(v, u); } dfs(1, 0, 0); dfs(1, 1); for (int i = 0; i < N - 1; i++) { int t = i * 2; if (dep[ed[t].u] < dep[ed[t].v]) swap(ed[t].u, ed[t].v); } } inline void add (int l, int r) { f[l]++, f[r + 1]--; } void solve (int u, int v) { int p = top[u], q = top[v]; while (p != q) { if (dep[p] < dep[q]) { swap(p, q); swap(u, v); } add(idx[p], idx[u]); u = far[p]; p = top[u]; } if (u == v) return; if (dep[u] > dep[v]) swap(u, v); add(idx[son[u]], idx[v]); } int main () { init(); scanf("%d", &Q); int u, v; while (Q--) { scanf("%d%d", &u, &v); solve(u, v); } int mv = 0; for (int i = 1; i <= N; i++) { mv += f[i]; f[i] = mv; } printf("%d", f[idx[ed[0].u]]); for (int i = 1; i < N - 1; i++) printf(" %d", f[idx[ed[i*2].u]]); printf("\n"); return 0; }
相关文章推荐
- CodeForces 191C Fools and Roads 树链剖分
- Codeforces-191C: Fools and Roads(LCA)
- CodeForces 191C Fools and Roads 树上的前缀和 LCA
- CF 191C Fools and Roads lca 或者 树链剖分
- 【CodeForces】191C Fools and Roads
- CodeForces 191C 树链剖分 第4遍
- CodeForces 191C 树链剖分 第4遍
- Codeforces 191 C Fools and Roads (树链剖分)
- Codeforce-191C-Fools and Roads (树链剖分 更新边权)
- CodeForces 题目191C. Fools and Roads(Link Cut Tree,边权加求边权值)
- Codeforces 192E Fools and Roads【树链剖分】
- Codeforces 191C Fools and Roads(树链拆分)
- [树链剖分 线段树] Codeforces 860E. Arkady and a Nobody-men
- CodeForces - 362D Fools and Foolproof Roads
- Codeforces 656 B. Scrambled(April Fools Day Contest 2016)
- Codeforces 588E Duff in the Army 【树链剖分维护区间前k小】
- CodeForces 487E UOJ 30 Tourists Tarjan + 树链剖分
- Codeforces April Fools Contest 2017
- Codeforces 786E ALT [网络流+树链剖分]
- Codeforces 593D - Happy Tree Party(树链剖分)