//Przemysław Jakub Kozłowski
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#define FI first
#define SE second
#define MP make_pair
using namespace std;
typedef long long LL;
const int N = 500005;
int n,m;
vector<int> V[N];
int ojc[N];
pair<int, int> przedzial[N];
int wart[N];
vector<int> tmptab;
LL wyn;
void DFSA(int x)
{
if(V[x].size() == 1) return;
for(int i = 0;i < V[x].size();i++)
if(V[x][i] != ojc[x])
{
ojc[V[x][i]] = x;
DFSA(V[x][i]);
}
tmptab.clear();
for(int i = 0;i < V[x].size();i++)
if(V[x][i] != ojc[x])
{
tmptab.push_back(przedzial[V[x][i]].FI);
tmptab.push_back(przedzial[V[x][i]].SE);
}
nth_element(tmptab.begin(), tmptab.begin()+tmptab.size()/2-1, tmptab.end());
int l = tmptab[tmptab.size()/2-1];
int p = tmptab[tmptab.size()/2];
for(int i = tmptab.size()/2;i < tmptab.size();i++)
p = min(p, tmptab[i]);
przedzial[x] = MP(l, p);
}
void DFSB(int x)
{
for(int i = 0;i < V[x].size();i++)
if(V[x][i] != ojc[x])
{
if(przedzial[V[x][i]].SE < wart[x]) wart[V[x][i]] = przedzial[V[x][i]].SE;
else if(wart[x] < przedzial[V[x][i]].FI) wart[V[x][i]] = przedzial[V[x][i]].FI;
else wart[V[x][i]] = wart[x];
wyn += abs(wart[x]-wart[V[x][i]]);
DFSB(V[x][i]);
}
}
int main()
{
scanf("%d%d", &n, &m);
if(n == m)
{
scanf("%*d%*d");
int a,b;
scanf("%d%d", &a, &b);
printf("%d\n", abs(b-a));
return 0;
}
for(int i = 1;i <= n-1;i++)
{
int a,b;
scanf("%d%d", &a, &b);
V[a].push_back(b);
V[b].push_back(a);
}
for(int i = 1;i <= m;i++)
{
int a;
scanf("%d", &a);
przedzial[i] = MP(a,a);
}
ojc[n] = -1;
DFSA(n);
wart[n] = przedzial[n].FI;
DFSB(n);
printf("%lld\n", wyn);
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 | //Przemysław Jakub Kozłowski #include <iostream> #include <cstdio> #include <algorithm> #include <vector> #define FI first #define SE second #define MP make_pair using namespace std; typedef long long LL; const int N = 500005; int n,m; vector<int> V[N]; int ojc[N]; pair<int, int> przedzial[N]; int wart[N]; vector<int> tmptab; LL wyn; void DFSA(int x) { if(V[x].size() == 1) return; for(int i = 0;i < V[x].size();i++) if(V[x][i] != ojc[x]) { ojc[V[x][i]] = x; DFSA(V[x][i]); } tmptab.clear(); for(int i = 0;i < V[x].size();i++) if(V[x][i] != ojc[x]) { tmptab.push_back(przedzial[V[x][i]].FI); tmptab.push_back(przedzial[V[x][i]].SE); } nth_element(tmptab.begin(), tmptab.begin()+tmptab.size()/2-1, tmptab.end()); int l = tmptab[tmptab.size()/2-1]; int p = tmptab[tmptab.size()/2]; for(int i = tmptab.size()/2;i < tmptab.size();i++) p = min(p, tmptab[i]); przedzial[x] = MP(l, p); } void DFSB(int x) { for(int i = 0;i < V[x].size();i++) if(V[x][i] != ojc[x]) { if(przedzial[V[x][i]].SE < wart[x]) wart[V[x][i]] = przedzial[V[x][i]].SE; else if(wart[x] < przedzial[V[x][i]].FI) wart[V[x][i]] = przedzial[V[x][i]].FI; else wart[V[x][i]] = wart[x]; wyn += abs(wart[x]-wart[V[x][i]]); DFSB(V[x][i]); } } int main() { scanf("%d%d", &n, &m); if(n == m) { scanf("%*d%*d"); int a,b; scanf("%d%d", &a, &b); printf("%d\n", abs(b-a)); return 0; } for(int i = 1;i <= n-1;i++) { int a,b; scanf("%d%d", &a, &b); V[a].push_back(b); V[b].push_back(a); } for(int i = 1;i <= m;i++) { int a; scanf("%d", &a); przedzial[i] = MP(a,a); } ojc[n] = -1; DFSA(n); wart[n] = przedzial[n].FI; DFSB(n); printf("%lld\n", wyn); return 0; } |
English