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