Advertisement
coloriot

HA15_v2

Jul 19th, 2024
35
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.39 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. // Деструктор и улучшение списка с нодами
  4.  
  5. class List {
  6. private:
  7.     // Вложенный класс, перенес ноды в прайват
  8.     class Node {
  9.     public:
  10.         Node(int val) : value(val), next(nullptr), prev(nullptr) {}
  11.  
  12.         int value;
  13.         Node* next;
  14.         Node* prev;
  15.     };
  16.  
  17. public:
  18.     // Конструктор
  19.     List() : start(nullptr), finish(nullptr), size(0) {}
  20.  
  21.     // Этот простой деструктор
  22.     ~List() {
  23.         // Пока список не пуст, удаляем элементы с начала
  24.         while (size > 0) {
  25.             pop_front();
  26.         }
  27.     }
  28.  
  29.     void push_back(int new_value) {
  30.         Node* new_node = new Node(new_value);
  31.         if (size > 0) {
  32.             finish->next = new_node;
  33.             new_node->prev = finish;
  34.         } else {
  35.             start = new_node;
  36.         }
  37.         finish = new_node;
  38.         ++size;
  39.     }
  40.  
  41.     void push_front(int new_value) {
  42.         Node* new_node = new Node(new_value);
  43.         new_node->next = start;
  44.         if (start != nullptr) {
  45.             start->prev = new_node;
  46.         }
  47.         start = new_node;
  48.         if (size == 0) {
  49.             finish = new_node;
  50.         }
  51.         ++size;
  52.     }
  53.  
  54.     void pop_front() {
  55.         if (size == 0) {
  56.             return;
  57.         }
  58.         Node* old_start = start;
  59.         start = start->next;
  60.         if (start != nullptr) {
  61.             start->prev = nullptr;
  62.         } else {
  63.             finish = nullptr;
  64.         }
  65.         delete old_start;
  66.         --size;
  67.     }
  68.  
  69.     void pop_back() {
  70.         if (size == 0) {
  71.             return;
  72.         }
  73.         Node* old_finish = finish;
  74.         finish = finish->prev;
  75.         if (finish != nullptr) {
  76.             finish->next = nullptr;
  77.         } else {
  78.             start = nullptr;
  79.         }
  80.         delete old_finish;
  81.         --size;
  82.     }
  83.  
  84.     // Геттер для доступа к первой ноде
  85.     Node* getStart() const { return start; }
  86.  
  87.     int getSize() const { return size; }
  88.  
  89. private:
  90.     Node* start;  // указатель на первый
  91.     Node* finish; // указатель на последний
  92.     int 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