BZOJ3319 黑白树
异常欢乐的并查集。馒头染色法。均摊O(n)的时间。 离线,先把每个染色操作会染黑哪些边算出来,把黑色子节点并到白色父节点里。 然后倒着处理,询问就直接用并查集问白色子节点顶上的黑色父节点最近是谁。染色操作再染回来。 #include <cstdio> #include <cctype> #include <cstring> #include <algorithm> using namespace std; struct edge { int t, i; edge *next; }; struct query { int t, v, ans; int *b; }; int _d_; #define readInt(_x_) { \ int& _s_ = _x_; \ _s_ = 0; \ while (!isdigit(_d_ = getchar())); \ while ((_s_ = _s_ * 10 + _d_ - 48), isdigit(_d_ = getchar())); \ } const int maxn = 1000009; int n, m, d[maxn], fa[maxn], v[maxn], c[maxn], r[maxn];...