Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
30774 | liuyile | 【S】T4 | C++ | 编译错误 | 0 | 0 MS | 0 KB | 4089 | 2024-07-30 14:15:42 |
#include<iostream> #include<cstring> #include<vector> #include<array> #include<algorithm> using namespace std; using LL = long long; const int maxn = 2e5 + 5; vector<pair<int, int> > tr[maxn * 4]; void modify(int u, int l, int r, int L, int R, pair<int, int> edge){ if (l > R or r < L) return; if (l >= L and r <= R){ tr[u].push_back(edge); return; } int mid = (l + r) / 2; modify(2 * u, l, mid, L, R, edge); modify(2 * u + 1, mid + 1, r, L, R, edge); } int ans[maxn], query[maxn], dep[maxn], fa[maxn]; namespace DSU{ int p[maxn], sz[maxn], sum[maxn], up[maxn]; vector<array<int, 5> > ops; int find(int x){ return p[x] == x ? x : find(p[x]); } void merge(int x, int y){ x = find(x), y = find(y); if (x == y) return; if (sz[x] > sz[y]) swap(x, y); ops.push_back({x, p[x], sz[x], sum[x], up[x]}); ops.push_back({y, p[y], sz[y], sum[y], up[y]}); if (dep[up[x]] < dep[up[y]]){ int t = find(fa[up[x]]); if (t != 0){ ops.push_back({t, p[t], sz[t], sum[t], up[t]}); sum[t] += sz[y]; } up[y] = up[x]; p[x] = y; sum[y] = sum[x] + sum[y] - sz[y]; sz[y] += sz[x]; } else{ int t = find(fa[up[y]]); if (t != 0){ ops.push_back({t, p[t], sz[t], sum[t], up[t]}); sum[t] += sz[x]; } p[x] = y; sum[y] = sum[x] + sum[y] - sz[x]; sz[y] += sz[x]; } } void undo(int ver){ while(ops.size() > ver){ auto [x, px, szx, sumx, upx] = ops.back(); ops.pop_back(); p[x] = px; sz[x] = szx; sum[x] = sumx; up[x] = upx; } } } void solve(int u, int l, int r){ int ver = DSU::ops.size(); for(auto [a, b] : tr[u]){ DSU::merge(a, b); } if (l == r){ if (query[r] != 0){ ans[r] = DSU::sum[DSU::find(query[r])]; int t = fa[DSU::up[DSU::find(query[r])]]; if (t != 0){ ans[r] += DSU::sz[DSU::find(t)]; } } DSU::undo(ver); return; } int mid = (l + r) / 2; solve(2 * u, l, mid); solve(2 * u + 1, mid + 1, r); DSU::undo(ver); } int main(){ // freopen("op.in","r",stdin); // freopen("op.out","w",stdout); cin.tie(0); cout.tie(0); ios::sync_with_stdio(0); int n, m; cin >> n >> m; vector<pair<int, int> > edge(n - 1); vector<int> t(n - 1), state(n - 1); vector<vector<int> > g(n + 1); for(int i = 0; i < n - 1; i++){ int a, b, c; cin >> a >> b >> c; edge[i] = {a, b}; state[i] = c; g[a].push_back(b); g[b].push_back(a); } auto dfs = [&](auto &&dfs, int u) -> void { for(auto j : g[u]){ if (j == fa[u]) continue; DSU::sum[u] += 1; fa[j] = u; dep[j] = dep[u] + 1; dfs(dfs, j); } }; dep[1] = 1; dfs(dfs, 1); for(int i = 1; i <= m; i++){ int op, x; cin >> op >> x; if (op == 1){ x--; state[x] ^= 1; if (state[x] == 1){ modify(1, 1, m, t[x] + 1, i, edge[x]); } else{ t[x] = i; } } else{ query[i] = x; } } for(int i = 0; i < n - 1; i++){ if (state[i] == 0){ modify(1, 1, m, t[i] + 1, m, edge[i]); } } for(int i = 1; i <= n; i++){ DSU::p[i] = DSU::up[i] = i; DSU::sz[i] = 1; DSU::sum[i] += 1; } solve(1, 1, m); for(int i = 1; i <= m; i++){ if (query[i] != 0){ cout << ans[i] << '\n'; } } }