比赛 2025.5.5 评测结果 AAAAAAATTT
题目名称 终末鸟 最终得分 70
用户昵称 LikableP 运行时间 39.542 s
代码语言 C++ 内存使用 91.59 MiB
提交时间 2025-05-05 10:56:48
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <cctype>

const int MAXN = 1e7 + 10;

int read() {
	int sum = 0, fl = 1;
	int ch = getchar();
	for (; !isdigit(ch); ch = getchar())
		if (ch == '-') fl = -1;
	for (; isdigit(ch); ch = getchar()) sum = sum * 10 + ch - '0';
	return sum * fl;
}

void write(int x) {
	static int sta[35];
	int top = 0;
	do {
		sta[top++] = x % 10, x /= 10;
	} while (x);
	while (top) putchar(sta[--top] + '0');
	putchar('\n');
}

struct EDGE {
	int v, next;
} edge[MAXN << 1];

int head[MAXN], edgeNum;
void AddEdge(int u, int v) {
	edgeNum++;
	edge[edgeNum].v = v;
	edge[edgeNum].next = head[u];
	head[u] = edgeNum;
}

int n, q;
int state[MAXN];
int vis[MAXN];
int centroid;
int onnum;

void dfs(int now) {
	vis[now] = 1;
	for (int i = head[now]; i; i = edge[i].next) {
		int v = edge[i].v;
		if (vis[v] || !state[v]) continue;
		dfs(v);
	}
}

void work() {
	memset(vis, 0, sizeof vis);
	int ans = 0;
	for (int i = 1; i <= n; ++i) {
		if (!vis[i] && state[i]) {
			dfs(i);
			ans++;
		}
	}
	write(ans);
}

void Solve1() {
	work();
	q = read();
	while (q--) {
		int x = read();
		state[x] ^= 1;
		work();
	}
}

void Solve2() {
	if (state[centroid]) {
		write(1);
	} else {
		write(onnum);
	}
	q = read();
	while (q--) {
		int x = read();
		if (x != centroid && state[x]) onnum--;
		if (x != centroid && !state[x]) onnum++;
		state[x] ^= 1;
		if (state[centroid]) {
			write(1);
		} else {
			write(onnum);
		}
	}
}

void Solve3() {
	int ans = 0;
	for (int i = 1; i <= n; ++i) {
		if (!vis[i] && state[i]) {
			dfs(i);
			ans++;
		}
	}
	write(ans);
	q = read();
	while (q--) {
		int x = read(), cnt = 0;
		for (int i = head[x]; i; i = edge[i].next) {
			if (state[edge[i].v]) cnt++;
		}
		if (state[x]) {
			if (cnt == 0) ans--;
			if (cnt == 1) ;
			if (cnt == 2) ans++;
		} else {
			if (cnt == 0) ans++;
			if (cnt == 1) ;
			if (cnt == 2) ans--;
		}
		state[x] ^= 1;
		write(ans);
	}
}

void Solve4() {
	int ans = 0;
	for (int i = 1; i <= n; ++i) {
		if (!vis[i] && state[i]) {
			dfs(i);
			ans++;
		}
	}
	write(ans);
	q = read();
	while (q--) {
		int x = read(), cnt = 0;
		for (int i = head[x]; i; i = edge[i].next) {
			if (state[edge[i].v]) cnt++;
		}
		if (state[x]) {
			if (cnt == 0) ans--;
			if (cnt == 1) ;
			if (cnt >= 2) ans += (cnt - 1);
		} else {
			if (cnt == 0) ans++;
			if (cnt == 1) ;
			if (cnt >= 2) ans -= (cnt - 1);
		}
		state[x] ^= 1;
		write(ans);
	}
}

int main() {
	freopen("birds.in", "r", stdin);
	freopen("birds.out", "w", stdout);
	bool special1 = 1, special2 = 1;
	int a, b;
	n = read();
	for (int i = 1; i <= n - 1; ++i) {
		int u = read(), v = read();
		if (i == 1) {
			a = u, b = v;
		} else {
			if (u == a || u == b) centroid = u;
			else if (v == a || v == b) centroid = v;
			else special1 = 0;
		}
		if (v - u != 1 && v - u != -1) special2 = 0;
		AddEdge(u, v);
		AddEdge(v, u);
	}
	for (int i = 1; i <= n; ++i) {
		state[i] = read();
		if (state[i] && i != centroid) onnum++;
	}
	if (n <= 1000) {
		Solve1();
	} else if (special1) {
		Solve2();
	} else if (special2) {
		Solve3();
	} else {
		Solve4();
	}
	return 0;
}