RE求调
查看原帖
RE求调
1529697
Xian__0609520楼主2025/6/24 10:51
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N = 1e5 + 5;
struct Seg {
	struct Node {
		int v, tag;
	} tr[N << 2];
	void build(int k, int l, int r) {
		tr[k].tag = -1;
		if (l == r) return ;
		int mid = (l + r) >> 1;
		build(k << 1, l, mid);
		build(k << 1 | 1, mid + 1, r);
	}
	inline void pushup(int k) {
		tr[k].v = tr[k << 1].v + tr[k << 1 | 1].v;
	}
	inline void add(int k, int l, int r, int v) {
		tr[k].v = (r - l + 1) * v;
		tr[k].tag = v;
	}
	inline void pushdown(int k, int l, int r, int mid) {
		if (tr[k].tag == -1) return ;
		add(k << 1, l, mid, tr[k].tag);
		add(k << 1 | 1, mid + 1, r, tr[k].tag);
		tr[k].tag = -1;
	}
	inline void modify(int k, int l, int r, int L, int R, int v) {
		if (l >= L && r <= R) return add(k, l, r, v);
		int mid = (l + r) >> 1;
		pushdown(k, l, r, mid);
		if (mid >= L) modify(k << 1, l, mid, L, R, v);
		if (mid < R) modify(k << 1 | 1, mid + 1, r, L, R, v);
		pushup(k);
	}
} T;
struct Edge {
	int v, next;
} e[N << 1];
int n, fa[N], q;
string opt;
int head[N], cnt;
int siz[N], dep[N], son[N], top[N], dfn[N], idx;
inline void add(int u, int v) {
	e[++cnt] = {v, head[u]};
	head[u] = cnt;
}
void dfs1(int u) {
	siz[u] = 1;
	dep[u] = dep[fa[u]] + 1;
	int mx = -1;
	for (int i = head[u]; i; i = e[i].next) {
		int v = e[i].v;
		if (v == fa[u]) continue;
		dfs1(v);
		siz[u] += siz[v];
		if (siz[v] > mx) {
			mx = siz[v];
			son[u] = v;
		}
	}
}
void dfs2(int u, int tp) {
	top[u] = tp;
	dfn[u] = ++idx;
	if (!son[u]) return ;
	dfs2(son[u], tp);
	for (int i = head[u]; i; i = e[i].next) {
		int v = e[i].v;
		if (v == fa[u] || v == son[u]) continue;
		dfs2(v, v);
	}
}
void modify_range(int x, int y, int v) {
	while (top[x] != top[y]) {
		if (dep[top[x]] < dep[top[y]]) swap(x, y);
		T.modify(1, 1, n, dfn[top[x]], dfn[x], v);
		x = fa[top[x]];
	}
	if (dep[x] > dep[y]) swap(x, y);
	T.modify(1, 1, n, dfn[x], dfn[y], v);
}
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n;
	for (int i = 2; i <= n; i++) {
		cin >> fa[i];
		fa[i]++;
		add(fa[i], i);
		add(i, fa[i]);
	}
	dfs1(1);
	dfs2(1, 1);
	T.build(1, 1, n);
	cin >> q;
	while (q--) {
		int x;
		cin >> opt;
		cin >> x;
		int lst = T.tr[1].v;
		if (opt[0] == 'i') {
			modify_range(1, x, 1);
		} else {
			T.modify(1, 1, n, dfn[x], dfn[x] + siz[x] - 1, 0);
		}
		cout << abs(lst - T.tr[1].v) << endl;
	}
	return 0;
}
2025/6/24 10:51
加载中...