提交时间:2023-12-09 15:02:34
运行 ID: 24151
//#include <bits/stdc++.h> #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <vector> #include <random> #include <cmath> #include <stack> #include <queue> #include <map> #include <set> using namespace std; typedef long long LL; const int N = 2e5 + 9, Mod = 998244353; int fpow(int a, int b) { int res = 1; while (b) { if (b & 1) res = 1ll * res * a % Mod; a = 1ll * a * a % Mod; b >>= 1; } return res; } vector<int> G[N]; int n, a[N], fa[N][20], dep[N], pw2[N], pw3[N]; void dfs(int u) { dep[u] = dep[fa[u][0]] + 1; for (int v : G[u]) { if (v == fa[u][0]) continue; fa[v][0] = u, dfs(v); } } int lca(int u, int v) { if (dep[u] < dep[v]) swap(u, v); for (int i = 17; i >= 0; i--) { if (dep[fa[u][i]] >= dep[v]) u = fa[u][i]; } if (u == v) return u; for (int i = 17; i >= 0; i--) { if (fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i]; } return fa[u][0]; } int dis(int u, int v) { if (!u || !v) return 1e9; return dep[u] + dep[v] - 2 * dep[lca(u, v)]; } namespace Sub2 { void Main() { int ans = 0; for (int u = 1; u <= n; u++) { int c1 = 0, c2 = 0; for (int v = 1; v <= n; v++) { if (dis(v, u) <= a[v]) { c1++; if (dis(v, fa[u][0]) <= a[v]) c2++; } } ans = ((LL)ans + pw3[c1] - pw3[c2] + Mod) % Mod; } printf("%d\n", ans); } } signed main() { // freopen("tree.in", "r", stdin); // freopen("tree.out", "w", stdout); pw2[0] = pw3[0] = 1; scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); pw2[i] = 2ll * pw2[i - 1] % Mod; pw3[i] = 3ll * pw3[i - 1] % Mod; } for (int i = 1; i < n; i++) { int u, v; scanf("%d%d", &u, &v); G[u].push_back(v); G[v].push_back(u); } dfs(1); for (int j = 1; (1 << j) <= n; j++) { for (int i = 1; i <= n; i++) { fa[i][j] = fa[fa[i][j - 1]][j - 1]; } } Sub2::Main(); fclose(stdin); fclose(stdout); return 0; }