比赛 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;
}