#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<cstdlib> #include<cmath> #include<vector> #include<map> #include<set> #include<queue> #include<bitset> using namespace std; typedef long long ll; typedef double db; const db pi=acos(-1); void gn(int &x){ int sg=1;char c;while(((c=getchar())<'0'||c>'9')&&c!='-'); if(c=='-')sg=-1,x=0;else x=c-'0'; while((c=getchar())>='0'&&c<='9')x=x*10+c-'0'; x*=sg; } void gn(ll &x){ int sg=1;char c;while(((c=getchar())<'0'||c>'9')&&c!='-'); if(c=='-')sg=-1,x=0;else x=c-'0'; while((c=getchar())>='0'&&c<='9')x=x*10+c-'0'; x*=sg; } int gcd(int a,int b){return b?gcd(b,a%b):a;} int n,m; struct edge{ int v,next; }e[1000005];int etot=0; int g[500005]; void ae(int u,int v){ e[etot].v=v;e[etot].next=g[u];g[u]=etot++; } ll f[500005]; int l[500005],r[500005]; int qu[500005];int p,q;int pre[500005]; int t[1000005];int tot; void dp(int u){ if(l[u])return; ll su=0; tot=0; for (int i=g[u];~i;i=e[i].next)if(e[i].v!=pre[u]){ su+=f[e[i].v]; t[++tot]=l[e[i].v]; t[++tot]=r[e[i].v]; } sort(t+1,t+1+tot); l[u]=t[tot/2]; r[u]=t[tot/2+1]; for (int i=g[u];~i;i=e[i].next)if(e[i].v!=pre[u]){ if(l[u]>r[e[i].v])su+=l[u]-r[e[i].v]; else if(l[u]<l[e[i].v])su+=l[e[i].v]-l[u]; } f[u]=su; } ll bfs(int rt){ p=q=0; qu[q++]=rt; pre[rt]=0; while(p!=q){ int u=qu[p++]; for (int i=g[u];~i;i=e[i].next)if(e[i].v!=pre[u]){ pre[e[i].v]=u; qu[q++]=e[i].v; } } for (int i=q-1;i>=1;i--)dp(qu[i]); int v=qu[1]; ll su=f[v]; if(l[1]>r[v])su+=l[1]-r[v]; else if(l[1]<l[v])su+=l[v]-l[1]; return su; } int main() { memset(g,-1,sizeof(g)); scanf("%d%d",&n,&m); for (int i=1;i<n;i++){ int u,v; gn(u);gn(v); ae(u,v); ae(v,u); } for (int i=1;i<=m;i++){ gn(l[i]); r[i]=l[i]; } cout<<bfs(1)<<endl; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<cstdlib> #include<cmath> #include<vector> #include<map> #include<set> #include<queue> #include<bitset> using namespace std; typedef long long ll; typedef double db; const db pi=acos(-1); void gn(int &x){ int sg=1;char c;while(((c=getchar())<'0'||c>'9')&&c!='-'); if(c=='-')sg=-1,x=0;else x=c-'0'; while((c=getchar())>='0'&&c<='9')x=x*10+c-'0'; x*=sg; } void gn(ll &x){ int sg=1;char c;while(((c=getchar())<'0'||c>'9')&&c!='-'); if(c=='-')sg=-1,x=0;else x=c-'0'; while((c=getchar())>='0'&&c<='9')x=x*10+c-'0'; x*=sg; } int gcd(int a,int b){return b?gcd(b,a%b):a;} int n,m; struct edge{ int v,next; }e[1000005];int etot=0; int g[500005]; void ae(int u,int v){ e[etot].v=v;e[etot].next=g[u];g[u]=etot++; } ll f[500005]; int l[500005],r[500005]; int qu[500005];int p,q;int pre[500005]; int t[1000005];int tot; void dp(int u){ if(l[u])return; ll su=0; tot=0; for (int i=g[u];~i;i=e[i].next)if(e[i].v!=pre[u]){ su+=f[e[i].v]; t[++tot]=l[e[i].v]; t[++tot]=r[e[i].v]; } sort(t+1,t+1+tot); l[u]=t[tot/2]; r[u]=t[tot/2+1]; for (int i=g[u];~i;i=e[i].next)if(e[i].v!=pre[u]){ if(l[u]>r[e[i].v])su+=l[u]-r[e[i].v]; else if(l[u]<l[e[i].v])su+=l[e[i].v]-l[u]; } f[u]=su; } ll bfs(int rt){ p=q=0; qu[q++]=rt; pre[rt]=0; while(p!=q){ int u=qu[p++]; for (int i=g[u];~i;i=e[i].next)if(e[i].v!=pre[u]){ pre[e[i].v]=u; qu[q++]=e[i].v; } } for (int i=q-1;i>=1;i--)dp(qu[i]); int v=qu[1]; ll su=f[v]; if(l[1]>r[v])su+=l[1]-r[v]; else if(l[1]<l[v])su+=l[v]-l[1]; return su; } int main() { memset(g,-1,sizeof(g)); scanf("%d%d",&n,&m); for (int i=1;i<n;i++){ int u,v; gn(u);gn(v); ae(u,v); ae(v,u); } for (int i=1;i<=m;i++){ gn(l[i]); r[i]=l[i]; } cout<<bfs(1)<<endl; return 0; } |