Advertisement
minimario

USACO17JAN01 (using node merging)

Jan 23rd, 2017
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.32 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 f first
  10. #define s second
  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 = 100005;
  16. const int MOD = 1000000007;
  17.  
  18. template <typename T>
  19. std::ostream& operator<< (std::ostream& out, const std::vector<T>& v) {
  20.   if ( !v.empty() ) {
  21.     out << '[';
  22.     std::copy (v.begin(), v.end(), std::ostream_iterator<T>(out, ", "));
  23.     out << "\b\b]";
  24.   }
  25.   return out;
  26. }
  27.  
  28.  
  29. struct BIT {
  30.     int t[MAX];
  31.     void reset() { F0R(i, MAX) { t[i] = 0; } }
  32.     void upd(int i, int v) { for(;i<MAX;i+=(i&(-i))) { t[i]+=v; } }
  33.     int get(int i) { int a = 0; for(;i>0; i-=i&(-i)) { a+=t[i]; } return a; }
  34. };
  35.  
  36. vi g[MAX];
  37.  
  38. int sz[MAX], st[MAX], fi[MAX], t[2*MAX];
  39. int ct = 1;
  40. void dfssz(int u, int p) {
  41.     t[ct] = u; st[u] = ct++;
  42.     sz[u] = 1;
  43.     for (int i : g[u]) {
  44.         dfssz(i, u); sz[u] += sz[i];
  45.     }
  46.     fi[u] = ct++;
  47. }
  48.  
  49. BIT b;
  50. int prof[MAX], cnt[MAX], ans[MAX];
  51. void dfs(int u, int p, bool keep) {
  52.     int maxi = -1, big = -1;
  53.     for (int i : g[u]) {
  54.         if (sz[i] > maxi) {
  55.             maxi = sz[i]; big = i;
  56.         }
  57.     }
  58.     for (int i : g[u]) {
  59.         if (i != big) { dfs(i, u, 0); }
  60.     }
  61.     if (big != -1) { dfs(big, u, 1); }
  62.     for (int i : g[u]) {
  63.         if (i != big) {
  64.             FOR(j, st[i], fi[i]+1) {
  65.                 if (t[j] == 0) { continue; }
  66.                 b.upd(prof[t[j]], 1);
  67.             }
  68.         }
  69.     }
  70.  
  71.     b.upd(prof[u], 1);
  72.     ans[u] = sz[u] - b.get(prof[u]);
  73.     if (keep == 0) {
  74.         FOR(j, st[u], fi[u]+1) {
  75.             if (t[j] == 0) { continue; }
  76.             b.upd(prof[t[j]], -1);
  77.         }
  78.     }
  79. }
  80. int main() {
  81.     freopen("promote.in", "r", stdin);
  82.     freopen("promote.out", "w", stdout);
  83.     int n; scanf("%d", &n);
  84.     vector<int> v;
  85.     F0R(i, n) { scanf("%d", &prof[i+1]); v.pb(prof[i+1]); }
  86.     sort(v.begin(), v.end());
  87.     v.resize(distance(v.begin(),unique(v.begin(), v.end())));
  88.     FOR(i, 1, n+1) { prof[i] = lower_bound(v.begin(), v.end(), prof[i]) - v.begin() + 1; }
  89.     FOR(i, 2, n+1) {
  90.         int u; scanf("%d", &u);
  91.         g[u].pb(i);
  92.     }
  93.     dfssz(1, 0);
  94.     dfs(1, 0, 0);
  95.     FOR(i, 1, n+1) { printf("%d\n", ans[i]); }
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement