Advertisement
Guest User

Untitled

a guest
Jan 21st, 2020
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.86 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4. #include <ext/rope>
  5.  
  6. #define ll long long
  7. #define ll128 __uint128_t
  8. #define ld long double
  9. #define vll vector <ll>
  10. #define vvll vector <vll>
  11. #define pll pair <ll, ll>
  12.  
  13. #define rep(i, a, b) for(ll i = a; i < b; i++)
  14. #define per(i, a, b) for(ll i = a - 1; i >= b; --i)
  15.  
  16. #define endl "\n"
  17. #define pb push_back
  18. #define pf push_front
  19.  
  20. #define all(v) (v).begin(), (v).end()
  21. #define rall(v) (v).rbegin(), (v).rend()
  22.  
  23. #define sorta(v) sort(all(v))
  24. #define sortd(v) sort(rall(v))
  25. #define vld vector<ld>
  26.  
  27. #define debug if (1)
  28. #define log(val) debug {cout << "\n" << #val << ": " << val << "\n";}
  29.  
  30. #define ios ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  31.  
  32. #define mod (ll)(1e9 + 7)
  33.  
  34. using namespace std;
  35. using namespace __gnu_cxx;
  36. using namespace __gnu_pbds;
  37.  
  38. ostream & operator << (ostream & out, vll & a) {
  39.     for(auto i : a) out << i << " ";
  40.     return out;
  41. }
  42.  
  43. istream & operator >> (istream & in, vll & a) {
  44.     for(auto &i : a) in >> i;
  45.     return in;
  46. }
  47.  
  48. const ll N = 3 * 1e5 + 10;
  49.  
  50. vll g[N];
  51. ll tin[N], tout[N];
  52. const ll logn = 20;
  53. ll up[N][logn];
  54. ll timer = 1;
  55.  
  56. ll h[N];
  57.  
  58. void dfs(ll v = 0, ll p = 0, ll curh = 1) {
  59.     tin[v] = timer++;
  60.     h[v] = curh;
  61.     up[v][0] = p;
  62.     rep(i, 1, logn + 1) {
  63.         up[v][i] = up[up[v][i - 1]][i - 1];
  64.     }
  65.     for(auto i : g[v]) {
  66.         if(i != p) {
  67.             dfs(i, v, curh + 1);
  68.         }
  69.     }
  70.     tout[v] = timer++;
  71. }
  72.  
  73. bool parent(ll a, ll b) {
  74.     return (tin[a] <= tin[b] && tout[a] >= tout[b]);
  75. }
  76.  
  77. ll lca(ll a, ll b) {
  78.     if(parent(a, b)) return a;
  79.     if(parent(b, a)) return b;
  80.     for(int i = logn; i >= 0; i--) {
  81.         if(!parent(up[a][i], b)) a = up[a][i];
  82.     }
  83.     return up[a][0];
  84. }
  85.  
  86. int main() {
  87.     // freopen("input.txt","r", stdin);
  88.     // freopen("output.txt","w", stdout);
  89.  
  90.     ll n, k;
  91.     cin >> n >> k;
  92.  
  93.     vll a(n + 1);
  94.     rep(i, 1, n + 1) {
  95.         cin >> a[i];
  96.     }
  97.     for (auto &i : a) i--;
  98.     rep(i, 0, n - 1) {
  99.         ll v1, v2;
  100.         cin >> v1 >> v2;
  101.         g[v1 - 1].pb(v2 - 1);
  102.         g[v2 - 1].pb(v1 - 1);
  103.     }
  104.     dfs(0);
  105.     vvll dp(n + 1, vll(k + 1, 1e18));
  106.  
  107.     if (n == 1) {
  108.         return cout << h[a[1]], 0;
  109.     }
  110.  
  111.     dp[0][0] = 0;
  112.  
  113.     rep (i, 0, n) {
  114.         // cout << i << endl;
  115.         rep(j, 0, k) {
  116.             dp[i + 1][j] = min(dp[i + 1][j], dp[i][j]);
  117.             dp[i + 1][j + 1] = min(dp[i + 1][j + 1], dp[i][j] + h[a[i + 1]]);
  118.             if (i + 2 <= n) {
  119.                 dp[i + 2][j + 1] = min(dp[i + 2][j + 1], dp[i][j] + h[lca(a[i + 1], a[i + 2])]);
  120.             }
  121.         }
  122.     }
  123.     /*
  124.     rep(i, 0, n + 1) {
  125.         rep(j, 0, k + 1) {
  126.             cout << dp[i][j] << " ";
  127.         }
  128.         cout << endl;
  129.     }
  130.     */
  131.     cout << dp[n][k] << endl;
  132.  
  133.     return 0;
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement