| 比赛 | 
    CSP2023-J模拟赛 | 
    评测结果 | 
    WWWWWWWWWW | 
    | 题目名称 | 
    新建题目 | 
    最终得分 | 
    0 | 
    | 用户昵称 | 
    mhh | 
    运行时间 | 
    0.000 s  | 
    | 代码语言 | 
    C++ | 
    内存使用 | 
    0.00 MiB  | 
    | 提交时间 | 
    2023-10-18 19:54:30 | 
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=2010;
int n,w[N],u,v,ver[2*N],nxt[2*N],hd[N],idx,d[N],vis[N],sum,tot;
void add(int a,int b){
	ver[++idx]=b;
	nxt[idx]=hd[a];
	hd[a]=idx;
}
void dfsd(int p,int fa){
	d[p]=d[fa]+1;
	for(int i=hd[p];i;i=nxt[i]){
		if(ver[i]!=fa){
			dfsd(ver[i],p);
		}
	}
}
int dfs(int p,int fa){
	int cnt=0,num=0,s=0;
	stack <int> st;
	while(st.size()) st.pop();
	for(int i=hd[p];i;i=nxt[i]){
		if(ver[i]!=fa&&d[ver[i]]>d[p]&&w[ver[i]]>w[p]){
			vis[ver[i]]=1;
			num++;
			st.push(dfs(ver[i],p));
			cnt+=st.top();
		}
	}
	if(!num) return 1;
	while(st.size()) s+=(st.top()*(cnt-st.top())),st.pop();
	return cnt+s/2;
}
int main(){
	freopen("touch.in","r",stdin);
	freopen("touch.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&w[i]);
	for(int i=1;i<n;i++){
		scanf("%d%d",&u,&v);
		add(u,v),add(v,u);
	}
	dfsd(1,0);
	for(int i=1;i<=n;i++) if(!vis[i]) tot=i,sum+=dfs(i,0);
	printf("%d",sum);
	return 0;
}