Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
230085 | 232214陈皓轩 | **小美的树上染色 | C++ | 解答错误 | 0 | 96 MS | 9848 KB | 1190 | 2024-01-07 15:41:54 |
#include <iostream> #include <cmath> #define int long long using namespace std; const int N(1e5 + 5); const int dN(N << 1); int dp[N][2], res[N]; //dp[u][0]: u白色 dp[u][1]:u红色 bool vis[N]; int a[N], e[dN], ne[dN], to[dN], w[dN], id; void add(int u, int v) { to[++id] = v; w[id] = a[u] * a[v]; ne[id] = e[u]; e[u] = id; } inline bool check(int x) { int y(sqrt(x) + 0.5); return y * y == x; } void dfs(int u, int fa) { vis[u] = 1; for (int i = e[u]; i; i = ne[i]) { int v(to[i]), wi(w[i]); if (!vis[u]) { dfs(v, u); dp[u][0] += res[v]; } } for (int i = e[u]; i; i = ne[i]) { int v(to[i]), wi(w[i]); if (v != fa && check(wi)) { dp[u][1] = max(dp[u][1], dp[u][0] - res[v] + dp[v][0] + 2); } } res[u] = max(dp[u][0], dp[u][1]); } signed main() { int n; cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; } for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; add(u, v); add(v, u); } int ans(0); for (int i = 1; i <= n; i++) { if (!vis[i]) { dfs(i, 0); ans += res[i]; } } for (int i = 1; i <= n; i++) cout << dp[i][0] << ' ' << dp[i][1] << '\n'; cout << ans; }