| 记录编号 |
615959 |
评测结果 |
AAAAAA |
| 题目名称 |
[ICPC2026河南省赛]蜗牛养殖 |
最终得分 |
100 |
| 用户昵称 |
RpUtl |
是否通过 |
通过 |
| 代码语言 |
C++ |
运行时间 |
0.377 s |
| 提交时间 |
2026-05-28 14:30:36 |
内存使用 |
11.49 MiB |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
const int mod = 998244353;
typedef long long ll;
int n, k, mk[N];
ll dp[N][3], g[3], ans;
vector<int>G[N];
void add(int x, int y) {
G[x].push_back(y);
}
void dfs(int x, int fa) {
dp[x][0] = 1;
for (auto y : G[x]) {
if (y == fa) {
continue;
}
dfs(y, x);
for (int i = 0; i < 3; ++i) {
g[i] = dp[x][i];
}
g[0] = (dp[x][0] * dp[y][0]) % mod;
g[1] = (dp[x][0] * dp[y][1] % mod + dp[x][1] * dp[y][1] % mod + dp[x][1] * dp[y][0] % mod) % mod;
g[2] = (dp[x][0] * dp[y][2] % mod + dp[x][2] * dp[y][2] % mod + dp[x][2] * dp[y][0] % mod) % mod;
for (int i = 0; i < 3; ++i) {
dp[x][i] = g[i];
}
}
if (x != 1) {
if (mk[x]) {
dp[x][1] = dp[x][2] = dp[x][0], dp[x][0] = 0;
} else {
dp[x][0] = (dp[x][0] * 2 + dp[x][1] + dp[x][2]) % mod;
}
} else {
if (!mk[1]) {
ans = (dp[x][0] + dp[x][1] + dp[x][2]) % mod;
} else {
ans = dp[x][0];
}
}
return;
}
int main() {
scanf("%d %d", &n, &k);
for (int i = 1, x; i <= k; i++) {
scanf("%d", &x);
mk[x] = 1;
}
for (int i = 1, u, v; i < n; i++) {
scanf("%d %d", &u, &v);
add(u, v), add(v, u);
}
dfs(1, 0);
cout << ans << endl;
return 0;
}