Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define gc c=getchar()
- #define r(x) read(x)
- #define ll long long
- #define fi first
- #define se second
- template<typename T>
- inline void read(T&x){
- x=0;T k=1;char gc;
- while(!isdigit(c)){if(c=='-')k=-1;gc;}
- while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
- }
- const int N=1e6+7;
- struct Edge{
- int u,v,w;
- }E[2][N];
- inline bool cmp0(const Edge &a,const Edge &b){
- return a.w>b.w;
- }
- inline bool cmp1(const Edge &a,const Edge &b){
- return a.w<b.w;
- }
- ll ans[2];
- int a[N],siz[N],fa[N];
- int find(int x){
- return x==fa[x]?x:fa[x]=find(fa[x]);
- }
- inline void Union(int u,int v){
- siz[fa[u]]+=siz[fa[v]];
- fa[fa[v]]=fa[u];
- }
- int main() {
- int n;r(n);
- for(int i=1;i<=n;++i){
- r(a[i]);
- }
- for(int i=1;i<n;++i){
- int u,v;r(u),r(v);
- E[0][i]={u,v,min(a[u],a[v])};
- E[1][i]={u,v,max(a[u],a[v])};
- }
- sort(E[0]+1,E[0]+n,cmp0);
- sort(E[1]+1,E[1]+n,cmp1);
- for(int k=0;k<2;++k){
- for(int i=1;i<=n;++i){
- fa[i]=i;
- siz[i]=1;
- }
- for(int i=1;i<n;++i){
- int u=E[k][i].u;
- int v=E[k][i].v;
- if(find(u)^find(v)){
- ans[k]+=(ll)siz[fa[u]]*siz[fa[v]]*E[k][i].w;
- Union(u,v);
- }
- }
- }
- // printf("%lld\n",ans[0]);
- // printf("%lld\n",ans[1]);
- printf("%lld\n",ans[1]-ans[0]);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment