Advertisement
coloriot

HA15

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