Advertisement
Guest User

Untitled

a guest
Aug 21st, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.23 KB | None | 0 0
  1. #include <iostream>
  2. #include <map>
  3. #include <vector>
  4. #include <deque>
  5. #include <array>
  6. #include <set>
  7. #include <sstream>
  8.  
  9.  
  10. std::deque<int> poles; // constamment de taille l !
  11. std::multiset<int> set;
  12. int counter { 0 };
  13.  
  14. // O(1)
  15. bool can_reach(int pos, int target)
  16. {
  17.     // hors-limites
  18.     if (target < 0 || target >= poles.size()) return false;
  19.     // taille des bordures du sous-élément différentes, c'est donc impossible
  20.     if (poles[pos] != poles[target]) return false;
  21.  
  22.     return *set.rbegin() <= poles[pos]; // si l'élément maximal du set (get en O(1) via rbegin()) est supérieur à la taille on retourne false
  23. }
  24.  
  25. // O(1)
  26. void process(int pos, int length)
  27. {
  28.     if (can_reach(pos, pos + length))
  29.     {
  30.         ++counter;
  31.     }
  32. }
  33.  
  34. // O(log n)
  35. void erase(std::multiset<int>& set, int val)
  36. {
  37.     auto itr = set.find(val);
  38.     if(itr!=set.end())
  39.     {
  40.         set.erase(itr);
  41.     }
  42. }
  43.  
  44. // The Algo :
  45. // On ne travaille que sur des sous ensembles de taille l
  46. // en gros, pour ne pas exploser la limite de mémoire, on utilise comme un genre de fenêtre glissante, qui récupère progressivement des données de l'entrée standard
  47. // à côté, on a un multiset, qui nous permet d'ajouter des valeurs en O(log n), et de récupérer le maximum en O(1) :
  48. // pour chaque sous-ensemble, on vérifier que le maximum du sous ensemble est <= les valeurs d'extrémités du sous ensemble
  49. // a chaque fois que oui, on augmente le compteur
  50. // et on l'affiche
  51.  
  52. int main()
  53. {
  54.     int length, amt_poles;
  55.     std::cin >> length >> amt_poles;
  56.  
  57.     // O(n log n)
  58.     for (int i { 0 }; i < amt_poles; ++i)
  59.     {
  60.         int val;
  61.         std::cin >> val;
  62.  
  63.         // O(log n)
  64.         // on construit encore le sous-ensemble initial
  65.         if (poles.size() <= length)
  66.         {
  67.             set.emplace(val);          poles.push_back(val);
  68.         }
  69.         // O(2*log n)
  70.         // on fait une rotation du sous-ensemble de taille l avec un nouvel élément récupéré de stdin
  71.         else
  72.         {
  73.             process(0, length);
  74.  
  75.             erase(set, poles.front()); poles.pop_front();
  76.             set.emplace(val);          poles.push_back(val);
  77.         }
  78.     }
  79.     process(0, length);
  80.  
  81.     std::cout << counter;
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement