Advertisement
VladNitu

DEQ

Nov 26th, 2022
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.51 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3.  
  4. struct hash_pair {
  5.     template<class T1, class T2>
  6.     size_t operator()(const std::pair<T1, T2> &p) const {
  7.         auto hash1 = std::hash<T1>{}(p.first);
  8.         auto hash2 = std::hash<T2>{}(p.second);
  9.         if (hash1 != hash2) {
  10.             return hash1 ^ hash2;
  11.         }
  12.         // If hash1 == hash2, their XOR is zero.
  13.         return hash1;
  14.     }
  15.  
  16. };
  17.  
  18. int T, N;
  19. long long ans = 0;
  20. std::multiset<int> pq;
  21. std::deque<int> Q;
  22. std::unordered_map<int, int> element_occurencies; // map el -> fv
  23. std::unordered_set<std::pair<int, int>, hash_pair> edge;
  24.  
  25. int main() {
  26.     std::cin >> N;
  27.     std::vector<int> v(N);
  28.     for (int i = 0; i < N; ++i)
  29.         std::cin >> v[i];
  30.  
  31.     int i = 0;
  32.  
  33.     while (true) {
  34.  
  35.         if (element_occurencies[v[i]] > 2)
  36.             break;
  37.  
  38.         if (Q.empty())
  39.             Q.push_back(v[i]);
  40.         else {
  41.             if (pq.empty()) { // pair
  42.  
  43.                 if (edge.find({Q.front(), v[i]}) == edge.end() || edge.find({v[i], Q.front()}) == edge.end()) {
  44.  
  45.                     if (Q.size() > 1) {
  46.                         int Min = std::min(Q.front(), v[i]);
  47.                         if (Min >= Q.back() || Q.size() == 2) {
  48.                             ans++;
  49.                             edge.insert({Q.front(), v[i]});
  50.                             edge.insert({v[i], Q.front()});
  51.  
  52.                             pq.insert(Q.back());
  53.                             Q.push_back(v[i]);
  54.                             element_occurencies[v[i]]++;
  55.                         }
  56.                         else {
  57.                             Q.pop_front();
  58.                             Q.push_back(v[i]);
  59.                             element_occurencies[v[i]]++;
  60.                         }
  61.                     } else {
  62.                         ans++;
  63.                         edge.insert({Q.front(), v[i]});
  64.                         edge.insert({v[i], Q.front()});
  65.  
  66.  
  67.  
  68.                         Q.push_back(v[i]);
  69.                         element_occurencies[v[i]]++;
  70.                     }
  71.                 } else {
  72.                     if (Q.size() > 1)
  73.                         pq.insert(Q.back());
  74.                     Q.push_back(v[i]);
  75.                     element_occurencies[v[i]]++;
  76.                 }
  77.             } else {
  78.  
  79.                 int Min = std::min(Q.front(), v[i]);
  80.                 if (Min >= *pq.rbegin() && Min >= Q.back()) {
  81.                     ans++;
  82.                     edge.insert({Q.front(), v[i]});
  83.                     edge.insert({v[i], Q.front()});
  84.  
  85.                     pq.insert(Q.back());
  86.                     Q.push_back(v[i]);
  87.                     element_occurencies[v[i]]++;
  88.                 } else {
  89.                     while (!pq.empty() && Min < std::max(Q.back(), *pq.rbegin())) {
  90.                         Q.pop_front();
  91.                         pq.erase(pq.find(Q.front()));
  92.                         Min = std::min(Q.front(), v[i]);
  93.                     }
  94.  
  95.                     if (!pq.empty()) {
  96.                         ans++;
  97.                         edge.insert({Q.front(), v[i]});
  98.                         edge.insert({v[i], Q.front()});
  99.  
  100.                         pq.insert(Q.back());
  101.                         Q.push_back(v[i]);
  102.                         element_occurencies[v[i]]++;
  103.                     }
  104.                 }
  105.             }
  106.  
  107.         }
  108.         i = (i + 1) % N;
  109.     }
  110.  
  111.     std::cout << ans << '\n';
  112.     // for (const auto &e: edge)
  113.         // std::cout << e.first << ' ' << e.second << '\n';
  114.     return 0;
  115. }
  116.  
  117.  
  118.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement