minimario

Indian IOI Training Camp: Zorgian Amusement Park

Jan 23rd, 2017
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.79 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5. typedef pair<int, int> pii;
  6. typedef vector<int> vi;
  7.  
  8. #define pb push_back
  9. #define mp make_pair
  10. #define f first
  11.  
  12. #define FOR(i, a, b) for (int i=a; i<b; i++)
  13. #define F0R(i, a) FOR(i, 0, a)
  14.  
  15. const int MAX = 200005;
  16. const int MOD = 1000000007;
  17. const int MAGIC = 3;
  18.  
  19. vi g[MAX];
  20. int h[MAX], s[MAX], sz = 0;
  21. // s is the stack
  22. ll tot = 0;
  23. void dfs(int u, int p) {
  24.     // cout << "-----------------------" << u << "---------------------------" << endl;
  25.     int lo = 0, hi = sz-1, szorig = sz, eleorig;
  26.     if (u == 1) { s[sz++] = h[u]; }
  27.     else {
  28.         while (lo < hi) {
  29.             int mid = (lo + hi) / 2;
  30.             if (s[mid] <= h[u]) { hi = mid; }
  31.             else { lo = mid + 1; }
  32.         }
  33.         if (h[u] < s[sz-1]) { lo = sz; }
  34.         if (lo == 0) { tot += sz; }
  35.         else if (h[u] == s[lo]) { tot += sz - lo; }
  36.         else { tot += sz - lo + 1; }
  37.         eleorig = s[lo];
  38.         sz = lo + 1; s[lo] = h[u];
  39.     }
  40.     // cout << "current stack: " << endl;
  41.     // F0R(i, sz) { cout << s[i] << " "; }
  42.     // cout << endl;
  43.     for (int v : g[u]) {
  44.         if (v == p) { continue; }
  45.         dfs(v, u);
  46.     }
  47.     if (u == 1) { return; }
  48.     sz = szorig; s[lo] = eleorig;
  49. }
  50. int main() {
  51.     int n; scanf("%d", &n);
  52.     F0R(i, n-1) {
  53.         int u, v; scanf("%d %d", &u, &v);
  54.         g[u].pb(v); g[v].pb(u);
  55.     }
  56.     vector<int> comp;
  57.     FOR(i, 1, n+1) { scanf("%d", &h[i]); comp.pb(h[i]); }
  58.     sort(comp.begin(), comp.end());
  59.     auto it = unique(comp.begin(), comp.end()); comp.erase(it, comp.end());
  60.     FOR(i, 1, n+1) { h[i] = lower_bound(comp.begin(), comp.end(), h[i]) - comp.begin() + 1; }
  61.     // FOR(i, 1, n+1) { cout << h[i] << endl; }
  62.     dfs(1, 0);
  63.     printf("%lld\n", tot);
  64. }
Advertisement
Add Comment
Please, Sign In to add comment