比赛 |
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;
}