Mlxa

BOI 2017 A code

Jun 14th, 2020
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.03 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define all(x) x.begin(), x.end()
  3. #define sz(x) (int)x.size()
  4. #define x first
  5. #define y second
  6. using namespace std;
  7. using ll  = long long;
  8. #define int ll
  9. #define mp make_pair
  10.  
  11. const int N = 2e5 + 10;
  12. const int INF = 1e18;
  13.  
  14. struct kek {
  15.     int add;
  16.     set<pair<int, int>> q;
  17.     kek() : add(0) {}
  18.     int query(int x) {
  19.         x -= add;
  20.         auto it = q.upper_bound(mp(x, INF));
  21.         if (it == q.begin()) {
  22.             return -INF;
  23.         } else {
  24.             --it;
  25.             return it->y;
  26.         }
  27.     }
  28.     int operator[](int x) {
  29.         return query(x);
  30.     }
  31.     void upd(int x, int y) {
  32.         x -= add;
  33.         if (query(x) >= y) {
  34.             return;
  35.         }
  36.         auto it = q.lower_bound(mp(x, -INF));
  37.         while (it != q.end() && it->y <= y) {
  38.             q.erase(it);
  39.             it = q.lower_bound(mp(x, -INF));
  40.         }
  41.         q.emplace(x, y);
  42.     }
  43.     int size() {
  44.         if (q.empty()) {
  45.             return 0;
  46.         } else {
  47.             return q.rbegin()->x + add + 1;
  48.         }
  49.     }
  50.     void clear() {
  51.         add = 0;
  52.         q.clear();
  53.     }
  54. };
  55.  
  56. int n;
  57. int d;
  58. vector<int> g[N];
  59. kek dp[N];
  60.  
  61. void solve(int v) {
  62.     dp[v].upd(0, 1);
  63.     for (int u : g[v]) {
  64.         solve(u);
  65.         kek son = dp[u];
  66.         son.add += 1;
  67.         if (dp[v].size() < son.size()) {
  68.             swap(dp[v].q, son.q);
  69.             swap(dp[v].add, son.add);
  70.         }
  71.         /*
  72.             cerr << "son " << u << endl;
  73.             for (int e : son) {
  74.                 cerr << e << " ";
  75.             }
  76.             cerr << endl;
  77.         */
  78.         for (int i = 0; i < (int)son.size(); ++i) {
  79.             int suff = max(i, d - i);
  80.             int value = dp[v][i];
  81.             if (suff < (int)dp[v].size()) {
  82.                 dp[v].upd(i, son[i] + dp[v][suff]);
  83.             }
  84.             if (suff < (int)son.size()) {
  85.                 dp[v].upd(i, value + son[suff]);
  86.             }
  87.             dp[v].upd(i, son[i]);
  88.         }
  89.        
  90.             cerr << "after " << u << endl;
  91.             for (auto e : dp[v].q) {
  92.                 cerr << e.x + dp[v].add << "\t" << e.y << endl;
  93.             }
  94.             cerr << endl;
  95.        
  96.         //son.clear();
  97.     }
  98. }
  99.  
  100. signed main() {
  101. #ifdef LC
  102.     assert(freopen("input.txt", "r", stdin));
  103. #endif
  104.     ios::sync_with_stdio(0), cin.tie(0);
  105.  
  106.     cin >> n >> d;
  107.     for (int p, i = 1; i < n; ++i) {
  108.         cin >> p;
  109.         g[p].push_back(i);
  110.     }
  111.     solve(0);
  112.     cout << dp[0][0] << "\n";
  113.  
  114.     return 0;
  115. }
Add Comment
Please, Sign In to add comment