怎么样例炸了
查看原帖
怎么样例炸了
923248
Lian_zy楼主2024/4/23 22:10

思路就是下载的话找 00 的个数,然后把 xx 到根的链上的都设为 11,卸载就输出子树中 11 的个数,然后把子树给变 00。

#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn = 1e5 + 10;
char s[10];
struct node {
	int l, r, sum, add;
} t[maxn << 2];
vector<int> G[maxn];
int n, m, op, x, TIME, d[maxn], f[maxn], dfn[maxn], top[maxn], siz[maxn], son[maxn];
void df(int u, int fa) {
	d[u] = d[fa] + 1;
	f[u] = fa;
	siz[u] = 1;
	for (auto v : G[u]) {
		if (v == fa) continue;
		df(v, u);
		siz[u] += siz[v];
		if (siz[son[u]] < siz[v]) son[u] = v;
	}
	return ;
}
void dfs(int u, int x) {
	dfn[u] = ++TIME;
	top[u] = x;
	if (son[u]) dfs(son[u], x);
	for (auto v : G[u]) {
		if (v == f[u] || v == son[u]) continue;
		dfs(v, v);
	}
	return ;
}
void push_up(int u) {
	t[u].sum = t[u << 1].sum + t[u << 1 | 1].sum;
	return ;
}
void tag(int u, int v) {
	t[u].sum = (t[u].r - t[u].l + 1) * v;
	t[u].add = v;
	return ;
}
void push_down(int u) {
	tag(u << 1, t[u].add);
	tag(u << 1 | 1, t[u].add);
	t[u].add = 0;
	return ;
}
void build(int u, int l, int r) {
	t[u].l = l;
	t[u].r = r;
	t[u].add = 0;
	if (l == r) {
		t[u].sum = 0;
		return ;
	}
	int mid = l + r >> 1;
	build(u << 1, l, mid);
	build(u << 1 | 1, mid + 1, r);
	push_up(u);
	return ;
}
void update(int u, int x, int y, int k) {
	if (t[u].l >= x && t[u].r <= y) {
		tag(u, k);
		return ;
	}
	push_down(u);
	int mid = t[u].l + t[u].r >> 1;
	if (x <= mid) update(u << 1, x, y, k);
	if (y > mid) update(u << 1 | 1, x, y, k);
	push_up(u);
	return ;
}
int query(int u, int x, int y) {
	if (x <= t[u].l && t[u].r <= y) return t[u].sum;
	int res = 0;
	int mid = t[u].l + t[u].r >> 1;
	push_down(u);
	if (x <= mid) res += query(u << 1, x, y);
	if (y > mid) res += query(u << 1 | 1, x, y);
	return res;
}
void upd(int x, int y, int k) {
	while (top[x] ^ top[y]) {
		if (d[top[x]] < d[top[y]]) swap(x, y);
		update(1, dfn[top[x]], dfn[x], k);
		x = f[top[x]];
	}
	if (d[x] > d[y]) swap(x, y);
	update(1, dfn[x], dfn[y], k);
	return ;
}
int qr(int x, int y) {
	int ans = 0;
	while (top[x] ^ top[y]) {
		if (d[top[x]] < d[top[y]]) swap(x, y);
		ans += (dfn[x] - dfn[top[x]] + 1) - query(1, dfn[top[x]], dfn[x]);
		x = f[top[x]];
	}
	if (d[x] > d[y]) swap(x, y);
	ans += (dfn[y] - dfn[x] + 1) * query(1, dfn[x], dfn[y]);
	return ans;
}
int main() {
	scanf("%d", &n);
	for (int i = 1; i < n; i++) {
		scanf("%d", &x);
		G[i].push_back(x);
		G[x].push_back(i);
	}
	df(0, 0);
	dfs(0, 0);
	build(1, 0, n - 1);
	scanf("%d", &m);
	while (m--) {
		scanf(" %s %d", s, &x);
		if (s[0] == 'i') {
			printf("%d\n", qr(1, x));
			upd(1, x, 1);
		} else {
			printf("%d\n", query(1, dfn[x], dfn[x] + siz[x] - 1));
			update(1, dfn[x], dfn[x] + siz[x] - 1, 0);
		}
	}
	return 0;
} 


2024/4/23 22:10
加载中...