Advertisement
mfgnik

Untitled

Jul 7th, 2020
1,144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.22 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <vector>
  3.  
  4.  
  5. struct fenvik {
  6.     int n;
  7.     std::vector<int> t;
  8.     explicit fenvik(int n) : n(n), t(n) {}
  9.  
  10.     void add(int index, int val) {
  11.         for (; index < n; index |= index + 1) {
  12.             t[index] += val;
  13.         }
  14.     }
  15.  
  16.     int pref(int index) {
  17.         int res = 0;
  18.         for (;index >= 0; index = (index & (index + 1)) - 1) {
  19.             res += t[index];
  20.         }
  21.         return res;
  22.     }
  23.  
  24.     int sum(int l, int r) {
  25.         return pref(r) - pref(l - 1);
  26.     }
  27. };
  28.  
  29.  
  30. int main() {
  31.     std::ios_base::sync_with_stdio(false);
  32.     std::cin.tie(nullptr);
  33.     std::cout.tie(nullptr);
  34.  
  35.     int max_ball, queries_amount;
  36.     std::cin >> max_ball >> queries_amount;
  37.     std::vector<int> open(max_ball, -1), close(max_ball, -1), pref_black{0},
  38.             addX(max_ball), addY(max_ball), query(queries_amount);
  39.  
  40.     for (int index = 0; index < queries_amount; ++index) {
  41.         std::string command;
  42.         int number;
  43.         std::cin >> command >> number;
  44.         query[index] = --number;
  45.         if (command[0] == 'a') {
  46.             open[number] = index;
  47.         } else {
  48.             close[number] = index;
  49.         }
  50.     }
  51.  
  52.     fenvik tree(queries_amount);
  53.     fenvik treeRed(queries_amount);
  54.  
  55.     for (int query_index = 0; query_index < queries_amount; ++query_index) {
  56.         int number = query[query_index];
  57.  
  58.         if (open[number] == query_index) {
  59.             if (close[number] != -1) {
  60.                 addY[number] += pref_black.back();
  61.                 tree.add(query_index, 1);
  62.             } else {
  63.                 pref_black.push_back(pref_black.back() + 1);
  64.             }
  65.         } else if (close[number] == query_index) {
  66.             addY[number] += tree.sum(0, open[number] - 1);
  67.             addX[number] += treeRed.sum(0, open[number]);
  68.             tree.add(open[number], -1);
  69.             treeRed.add(query_index + 1, -1);
  70.             treeRed.add(open[number], 1);
  71.         }
  72.     }
  73.  
  74.     int64_t ans = queries_amount;
  75.  
  76.     for (int index = 0; index < max_ball; ++index) {
  77.         if (close[index] != -1) {
  78.             ans += std::min(addX[index], addY[index]) * 2;
  79.         }
  80.     }
  81.  
  82.     std::cout << ans << '\n';
  83.     return 0;
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement