Advertisement
coloriot

HA15_V2

Jul 19th, 2024
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.69 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. // Деструктор и улучшение списка с нодами
  4.  
  5. // Эта версия отличается от предыдущей одной хитростью - я свопнул местами private и public!
  6. // До этого вылезали ошибки - геттер ноды был до создания ноды
  7.  
  8. class List {
  9. private:
  10.     // Вложенный класс, перенес ноды в прайват
  11.     class Node {
  12.     public:
  13.         Node(int val) : value(val), next(nullptr), prev(nullptr) {}
  14.  
  15.         int value;
  16.         Node* next;
  17.         Node* prev;
  18.     };
  19.  
  20.     Node* start;  // указатель на первый
  21.     Node* finish; // указатель на последний
  22.     int size;     // размер
  23.  
  24. public:
  25.     // Конструктор
  26.     List() : start(nullptr), finish(nullptr), size(0) {}
  27.  
  28.     // Этот простой деструктор удаляет все ноды
  29.     ~List() {
  30.         // Пока список не пуст, удаляем элементы с начала
  31.         while (size > 0) {
  32.             pop_front();
  33.         }
  34.     }
  35.  
  36.     void push_back(int new_value) {
  37.         Node* new_node = new Node(new_value);
  38.         if (size > 0) {
  39.             finish->next = new_node;
  40.             new_node->prev = finish;
  41.         } else {
  42.             start = new_node;
  43.         }
  44.         finish = new_node;
  45.         ++size;
  46.     }
  47.  
  48.     void push_front(int new_value) {
  49.         Node* new_node = new Node(new_value);
  50.         new_node->next = start;
  51.         if (start != nullptr) {
  52.             start->prev = new_node;
  53.         }
  54.         start = new_node;
  55.         if (size == 0) {
  56.             finish = new_node;
  57.         }
  58.         ++size;
  59.     }
  60.  
  61.     void pop_front() {
  62.         if (size == 0) {
  63.             return;
  64.         }
  65.         Node* old_start = start;
  66.         start = start->next;
  67.         if (start != nullptr) {
  68.             start->prev = nullptr;
  69.         } else {
  70.             finish = nullptr;
  71.         }
  72.         delete old_start;
  73.         --size;
  74.     }
  75.  
  76.     void pop_back() {
  77.         if (size == 0) {
  78.             return;
  79.         }
  80.         Node* old_finish = finish;
  81.         finish = finish->prev;
  82.         if (finish != nullptr) {
  83.             finish->next = nullptr;
  84.         } else {
  85.             start = nullptr;
  86.         }
  87.         delete old_finish;
  88.         --size;
  89.     }
  90.  
  91.     Node* getStart() const { return start; } // Вот это наш геттер ноды - теперь не ломается!
  92.     int getSize() const { return size; }
  93. };
  94.  
  95. void process_operation(List* compartments, char op, int index, int value, int& current_total, int& max_total) {
  96.     if (op == '+') {
  97.         compartments[index - 1].push_back(value);
  98.         current_total++;
  99.     } else if (op == '-') {
  100.         if (compartments[index - 1].getStart() != nullptr && compartments[index - 1].getStart()->value == value) {
  101.             compartments[index - 1].pop_front();
  102.             current_total--;
  103.         }
  104.     }
  105.  
  106.     if (current_total > max_total) {
  107.         max_total = current_total;
  108.     }
  109. }
  110.  
  111. int main() {
  112.     int N, K, P;
  113.     std::cin >> N >> K >> P;
  114.     std::cin.ignore();
  115.  
  116.     List* compartments = new List[N];
  117.  
  118.     char op;
  119.     int index, value;
  120.     int current_total = 0;
  121.     int max_total = 0;
  122.  
  123.     for (int i = 0; i < P; ++i) {
  124.         std::cin >> op >> index >> value;
  125.         process_operation(compartments, op, index, value, current_total, max_total);
  126.     }
  127.  
  128.     std::cout << max_total << std::endl;
  129.  
  130.     // Тут нам помогает деструктор - раньше была очистка циклом!
  131.     delete[] compartments;
  132.     return 0;
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement