Advertisement
Guest User

Untitled

a guest
Dec 14th, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.14 KB | None | 0 0
  1. #include <cstdio>
  2. #include <memory.h>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <cassert>
  6. using namespace std;
  7.  
  8. const int N = 300500;
  9. const int inf = 1000 * 1000 * 1000 + 42;
  10.  
  11. int R[N];
  12. vector<pair<int, int> > E[N];
  13. int cur_layer = 0;
  14. vector<pair<int, int> > L[2 * N];
  15. int lpt[2 * N];
  16. int S[N];
  17. bool dead[N];
  18. vector<pair<int, int> > ver_L[N];
  19.  
  20. int DFS(int x, int sz, int p = -1)
  21. {
  22.     S[x] = 1;
  23.     int pass_root = -1;
  24.     for (int i = 0; i < E[x].size(); i++)
  25.     {
  26.         int y = E[x][i].first;
  27.         if (y == p)
  28.             continue;
  29.         if (dead[y])
  30.         {
  31.             swap(E[x][i], E[x].back());
  32.             --i;
  33.             E[x].pop_back();
  34.             continue;
  35.         }
  36.         int r = DFS(y, sz, x);
  37.         if (r != -1)
  38.             pass_root = r;
  39.         S[x] += S[y];
  40.     }
  41.     bool ok = (sz - S[x]) <= sz / 2;
  42.     for (int i = 0; i < E[x].size(); i++)
  43.     {
  44.         int y = E[x][i].first;
  45.         ok &= S[y] <= sz / 2;
  46.     }
  47.     if (ok)
  48.         pass_root = x;
  49.     return pass_root;
  50. }
  51.  
  52. void DFS2(int x, int l = 0, int p = -1)
  53. {
  54.     L[cur_layer].push_back(make_pair(l, x));
  55.     if (R[x] >= l)
  56.         ver_L[x].push_back(make_pair(cur_layer, R[x] - l));
  57.     S[x] = 1;
  58.     for (int i = 0; i < E[x].size(); i++)
  59.     {
  60.         int y = E[x][i].first;
  61.         int d = E[x][i].second;
  62.         if (y == p)
  63.             continue;
  64.         DFS2(y, min(l + d, inf), x);
  65.         S[x] += S[y];
  66.     }
  67. }
  68.  
  69. void create_layer(int x, int sz)
  70. {
  71.     L[cur_layer].reserve(sz);
  72.     int root = DFS(x, sz);
  73.     assert(root != -1);
  74.     DFS2(root);
  75.     sort(L[cur_layer].begin(), L[cur_layer].end());
  76.     dead[root] = true;
  77.     cur_layer++;
  78.     for (int i = 0; i < E[root].size(); i++)
  79.         create_layer(E[root][i].first, S[E[root][i].first]);
  80. }
  81.  
  82. vector<int> ord;
  83. bool was[N];
  84.  
  85. void mark(int x)
  86. {
  87.     was[x] = true;
  88.     for (int i = 0; i < ver_L[x].size(); i++)
  89.     {
  90.         int l = ver_L[x][i].first;
  91.         int d = ver_L[x][i].second;
  92.         while (lpt[l] != L[l].size() && L[l][lpt[l]].first <= d)
  93.         {
  94.             int y = L[l][lpt[l]++].second;
  95.             if (!was[y])
  96.                 mark(y);
  97.         }
  98.     }
  99.     ord.push_back(x);
  100. }
  101.  
  102. int main()
  103. {
  104. #ifndef LOCAL42
  105.     freopen("alarm.in", "r", stdin);
  106.     freopen("alarm.out", "w", stdout);
  107. #endif
  108.     int n;
  109.     scanf("%d", &n);
  110.     for (int i = 0; i < n; i++)
  111.         scanf("%d", &R[i]);
  112.     for (int i = 0; i < n - 1; i++)
  113.     {
  114.         int a, b, l;
  115.         scanf("%d %d %d", &a, &b, &l);
  116.         --a, --b;
  117.         E[a].push_back(make_pair(b, l));
  118.         E[b].push_back(make_pair(a, l));
  119.     }
  120.     create_layer(0, n);
  121.     for (int i = 0; i < cur_layer; i++)
  122.         sort(L[i].begin(), L[i].end());
  123.     ord.reserve(n);
  124.     for (int i = 0; i < n; i++)
  125.         if (!was[i])
  126.             mark(i);
  127.     vector<int> rord;
  128.     rord.swap(ord);
  129.     ord.reserve(n);
  130.     reverse(rord.begin(), rord.end());
  131.     int ans = 0;
  132.     memset(was, 0, sizeof(was));
  133.     memset(lpt, 0, sizeof(lpt));
  134.     for (int i = 0; i < rord.size(); i++)
  135.         if (!was[rord[i]])
  136.             mark(rord[i]), ans++;
  137.     printf("%d\n", ans);
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement