比赛 |
CSP2023-J模拟赛 |
评测结果 |
AAAAAAAAAA |
题目名称 |
新建题目 |
最终得分 |
100 |
用户昵称 |
usr10086 |
运行时间 |
0.293 s |
代码语言 |
C++ |
内存使用 |
3.59 MiB |
提交时间 |
2023-10-18 20:04:13 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N = 2e3 + 10;
ifstream fin("touch.in");
ofstream fout("touch.out");
#define cin fin
#define cout fout
struct D
{
int i, down;
};
bool vis[N];
int n, fa[N], w[N], dep[N], path[N];
vector<int> son[N], g[N];
void dfs(int x, int fa)
{
dep[x] = dep[fa]+1; ::fa[x] = fa;
for (int y : g[x])
{
if (y == fa) continue;
son[x].push_back(y);
dfs(y, x);
}
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++) cin >> w[i];
for (int i = 1, u, v; i <= n-1; i++)
cin >> u >> v, g[u].push_back(v), g[v].push_back(u);
dfs(1, 0);
long long ans = 0;
for (int i = 1; i <= n; i++)
{
int x = i;
while (x) path[dep[x]] = x, x = fa[x];
x = i;
memset(vis, 0, sizeof(bool)*(n+1));
queue<D> q;
q.push({i, false}); vis[i] = true;
int cnt = 0;
while (!q.empty())
{
D k = q.front(); q.pop();
cnt++;
int i = k.i, down = k.down;
if (!down)
{
int f = fa[i];
if (f && !vis[f] && w[f] < w[i]) vis[f] = true, q.push({f, false});
}
for (int y : son[i])
if (!vis[y] && (w[y] > max(w[i], w[path[dep[i]]]) && (dep[y] >= dep[x] || w[y] < w[path[dep[y]+1]]))) vis[y] = true, q.push({y, true});
}
for (int d = 0; d <= dep[x]; d++) path[d] = 0;
ans += (cnt-1); // i->i does not count
}
cout << ans / 2;
}