Advertisement
fieros

minOnSegment

Nov 14th, 2021
734
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.39 KB | None | 0 0
  1. /**
  2.  * Рассмотрим последовательность целых чисел длины N.
  3.  * По ней с шагом 1 двигается “окно” длины K, то есть сначала в “окне” видно первые K чисел,
  4.  * на следующем шаге в “окне” уже будут находиться K чисел, начиная со второго, и так далее до конца последовательности.
  5.  * Требуется для каждого положения “окна” определить минимум в нём.
  6.  *
  7. Входные данные
  8. В первой строке входных данных содержатся два числа N и K (1 ≤  N ≤  150000, 1 ≤ K ≤ 10000, K ≤  N)
  9.  – длины последовательности и “окна”, соответственно. На следующей строке находятся N чисел – сама последовательность.
  10.  
  11. Выходные данные
  12. Выходые данные должны содержать N − K + 1 строк – минимумы для каждого положения “окна”.
  13.  */
  14. #include <stdexcept>
  15. #include <iostream>
  16. #include <vector>
  17.  
  18. using namespace std;
  19.  
  20. class Node {
  21. public:
  22.     Node* pnext, *pprev;
  23.     int data;
  24.  
  25.     Node(int x = 0): data(x), pnext(nullptr), pprev(nullptr) {}
  26.     Node(int x, Node* next, Node* prev = nullptr): data(x), pnext(next), pprev(prev) {}
  27. };
  28.  
  29. class DequeAsLinkedList {
  30. private:
  31.     Node* head;
  32.     Node* tail;
  33. public:
  34.     DequeAsLinkedList(): head(new Node()), tail(new Node()) {
  35.         head->pnext = tail;
  36.         tail->pprev = head;
  37.     }
  38.  
  39.     void push_front(int elem) {
  40.         auto newNode = new Node(elem, head->pnext, head);
  41.         head->pnext->pprev = newNode;
  42.         head->pnext = newNode;
  43.     }
  44.  
  45.     int pop_front() {
  46.         if (head->pnext == tail)
  47.             throw out_of_range("Deque is empty!");
  48.         int res = head->pnext->data;
  49.         auto oldNode = head->pnext;
  50.         head->pnext = oldNode->pnext;
  51.         head->pnext->pprev = head;
  52.         delete oldNode;
  53.         return res;
  54.     }
  55.  
  56.     void push_back(int elem) {
  57.         auto newNode = new Node(elem, tail, tail->pprev);
  58.         tail->pprev->pnext = newNode;
  59.         tail->pprev = newNode;
  60.     }
  61.  
  62.     int pop_back() {
  63.         if (head->pnext == tail)
  64.             throw out_of_range("Deque is empty!");
  65.         auto oldNode = tail->pprev;
  66.         int res = oldNode->data;
  67.         tail->pprev = oldNode->pprev;
  68.         tail->pprev->pnext = tail;
  69.         delete oldNode;
  70.         return res;
  71.     }
  72.  
  73.     bool empty() {
  74.         return head->pnext == tail;
  75.     }
  76.  
  77.     int back() {
  78.         if (this->empty())
  79.             throw out_of_range("Stack is empty");
  80.         return tail->pprev->data;
  81.     }
  82.  
  83.     int front() {
  84.         if (this->empty())
  85.             throw out_of_range("Stack is empty");
  86.         return head->pnext->data;
  87.     }
  88.  
  89.     void pr() {
  90.         if (head == tail->pprev) {
  91.             cout << "Stack is empty!" << endl;
  92.             return;
  93.         }
  94.  
  95.         Node* e = head->pnext;
  96.         while (e != tail) {
  97.             cout << e->data << " ";
  98.             e = e->pnext;
  99.         }
  100.         cout << endl;
  101.     }
  102.  
  103.     ~DequeAsLinkedList() {
  104.         auto e = head;
  105.         auto d = head;
  106.         while (d != tail) {
  107.             d = e;
  108.             e = e->pnext;
  109.             delete d;
  110.         }
  111.     }
  112. };
  113.  
  114. class QueueWithMin {
  115.     DequeAsLinkedList deque;
  116. public:
  117.     QueueWithMin(): deque() {}
  118.  
  119.     void push(int elem) {
  120.         while (!deque.empty() && deque.back() > elem) {
  121.             deque.pop_back();
  122.         }
  123.         deque.push_back(elem);
  124.     }
  125.  
  126.     void pop(int removed_elem) {
  127.         if (deque.front() == removed_elem)
  128.             deque.pop_front();
  129.     }
  130.  
  131.     int min() {
  132.         return deque.front();
  133.     }
  134.  
  135.     bool empty() {
  136.         return deque.empty();
  137.     }
  138.  
  139.     void pr() {
  140.         deque.pr();
  141.     }
  142. };
  143.  
  144. int main() {
  145.    int n, k;
  146.    cin >> n >> k;
  147.    vector<int> nums(n);
  148.    for (int i = 0; i < n; i++) {
  149.        cin >> nums[i];
  150.    }
  151.    QueueWithMin s;
  152.  
  153.    for (int i = 0; i < k; i++) {
  154.        s.push(nums[i]);
  155.    }
  156.  
  157.    for (int i = 0; i < n - k + 1; i++) {
  158.        cout << s.min() << endl;
  159.        s.pop(nums[i]);
  160.        if (i + k < n)
  161.            s.push(nums[i+k]);
  162.    }
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement