Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
30866 | gaochunzhen | 【S】T4 | C++ | 通过 | 100 | 1130 MS | 36684 KB | 3761 | 2024-07-31 10:52:41 |
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2e5 + 9, B = 300, S = N / B + 9; struct Edge { int v, w, nxt; } E[N << 1]; int head[N], tot(1); void add(int u, int v, int w) { E[++tot].v = v, E[tot].w = w; E[tot].nxt = head[u], head[u] = tot; } int n, m, dfn[N], siz[N], fa[N][21]; struct Block { int cnt[S][N], a[N], lz[S], bel[N], lt[S], rt[S]; void init() { for (int i = 1; i <= n; i++) bel[i] = (i + B - 1) / B; for (int i = 1; i <= bel[n]; i++) { lt[i] = rt[i - 1] + 1, rt[i] = min(n, i * B); } for (int i = 1; i <= n; i++) cnt[bel[i]][a[i]]++; } void mod(int l, int r, int v) { int id = bel[l], _l = lt[id], _r = rt[id]; for (int i = _l; i <= _r; i++) { cnt[id][a[i]]--, a[i] += lz[id]; } lz[id] = 0; for (int i = l; i <= r; i++) a[i] += v; for (int i = _l; i <= _r; i++) { cnt[id][a[i]]++; } } void upd(int l, int r, int v) { int idl = bel[l], idr = bel[r]; if (idl == idr) mod(l, r, v); else { mod(l, rt[idl], v), mod(lt[idr], r, v); for (int i = idl + 1; i < idr; i++) { lz[i] += v; } } } int qry(int x) {return a[x] + lz[bel[x]];} int qry(int l, int r, int v) { int idl = bel[l], idr = bel[r], res = 0; if (idl == idr) { for (int i = l; i <= r; i++) { if (a[i] + lz[idl] == v) res++; } } else { for (int i = l; i <= rt[idl]; i++) { if (a[i] + lz[idl] == v) res++; } for (int i = lt[idr]; i <= r; i++) { if (a[i] + lz[idr] == v) res++; } for (int i = idl + 1; i < idr; i++) { if (v >= lz[i]) res += cnt[i][v - lz[i]]; } } return res; } } Bl; void dfs(int u, int sum) { dfn[u] = ++dfn[0], siz[u] = 1, Bl.a[dfn[u]] = sum; for (int i = head[u]; i; i = E[i].nxt) { int v = E[i].v; if (v == fa[u][0]) continue; fa[v][0] = u, dfs(v, sum + E[i].w), siz[u] += siz[v]; } } signed main() { scanf("%d%d", &n, &m); for (int i = 1; i < n; i++) { int u, v, w; scanf("%d%d%d", &u, &v, &w); add(u, v, w), add(v, u, w); } dfs(1, 0), Bl.init(); for (int j = 1; (1 << j) <= n; j++) { for (int i = 1; i <= n; i++) { fa[i][j] = fa[fa[i][j - 1]][j - 1]; } } while (m--) { int op, x; scanf("%d%d", &op, &x); if (op == 1) { int u = E[x << 1].v, v = E[x << 1 | 1].v; E[x << 1].w ^= 1, E[x << 1 | 1].w ^= 1; if (dfn[u] < dfn[v]) swap(u, v); if (E[x << 1].w) Bl.upd(dfn[u], dfn[u] + siz[u] - 1, 1); else Bl.upd(dfn[u], dfn[u] + siz[u] - 1, -1); } else { int u, v = x, ans = 0, f = Bl.qry(dfn[x]); for (int i = 17; i >= 0; i--) { if (fa[v][i] && Bl.qry(dfn[fa[v][i]]) == f) { v = fa[v][i]; } } ans = Bl.qry(dfn[v], dfn[v] + siz[v] - 1, f) + Bl.qry(dfn[v], dfn[v] + siz[v] - 1, f + 1); if (v > 1) { u = fa[v][0]; for (int i = 17; i >= 0; i--) { if (fa[u][i] && Bl.qry(dfn[fa[u][i]]) == f - 1) { u = fa[u][i]; } } ans += Bl.qry(dfn[u], dfn[u] + siz[u] - 1, f - 1); } printf("%d\n", ans); } } return 0; }