Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
229953 | 232214陈皓轩 | **小美的树上染色 | C++ | 解答错误 | 30 | 100 MS | 10428 KB | 889 | 2024-01-07 14:16:11 |
#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]; //dp[u][0]: u白色 dp[u][1]:u红色 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) { for (int i = e[u]; i; i = ne[i]) { int v(to[i]), wi(w[i]); if (v != fa) { dfs(v, u); dp[u][0] = max(dp[u][0], max(dp[v][0], dp[v][1])); if (check(wi)) dp[u][1] = max(dp[u][1], dp[v][0] + 2); } } } 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); } dfs(1, 0); cout << max(dp[1][0], dp[1][1]); }