pochti_da

Untitled

Jun 6th, 2024
371
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.61 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <set>
  6.  
  7. int main()
  8. {
  9.     /*
  10.     Для чтения входных данных необходимо получить их
  11.     из стандартного потока ввода (stdin).
  12.     Данные во входном потоке соответствуют описанному
  13.     в условии формату. Обычно входные данные состоят
  14.     из нескольких строк.
  15.  
  16.     Можно использовать несколько методов:
  17.     * std::cin -- читает токены из потока;
  18.     * std::getline() -- читает одну строку из потока;
  19.     * scanf()/gets() -- C-функции для чтения из stdin.
  20.  
  21.     Чтобы прочитать из строки стандартного потока:
  22.     * число -- int var; std::cin >> var;
  23.     * строку -- std::string svar; std::cin >> svar;
  24.     * массив чисел известной длины --
  25.     std::vector<int> arr(len);
  26.     for (size_t i = 0; i < arr.size(); ++i)
  27.         std::cin >> arr[i];
  28.     * последовательность слов до конца файла --
  29.     std::vector<std::string> sarr;
  30.     std::string word;
  31.     while (std::cin >> word) {
  32.         sarr.push_back(word);
  33.     }
  34.  
  35.     Чтобы вывести результат в стандартный поток вывода (stdout),
  36.     можно использовать поток std::cout.
  37.  
  38.     Возможное решение задачи "Вычислите сумму A+B":
  39.     int a, b;
  40.     std::cin >> a >> b;
  41.     std::cout << a + b << std::endl;
  42.     */
  43.     int N;
  44.     std::cin >> N;
  45.  
  46.     std::vector<std::pair<int, int>> skills(N);
  47.     for (auto &[a, b] : skills)
  48.         std::cin >> a;
  49.     for (auto &[a, b] : skills)
  50.         std::cin >> b;
  51.  
  52.     std::vector<std::pair<int, int>> diffs;
  53.     for (size_t i = 0; i < N; ++i)
  54.         diffs.emplace_back(skills[i].first - skills[i].second, i);
  55.     std::sort(diffs.begin(), diffs.end());
  56.  
  57.     std::set<std::pair<int, int>> programmers;
  58.     std::set<std::pair<int, int>> managers;
  59.  
  60.     size_t programmersSum = 0;
  61.     size_t managersSum = 0;
  62.  
  63.     for (size_t i = 0; i < diffs.size() / 2; ++i)
  64.     {
  65.         managers.insert(diffs[i]);
  66.         managersSum += skills[diffs[i].second].second;      
  67.     }
  68.     for (size_t i = diffs.size() / 2; i < diffs.size(); ++i)
  69.     {
  70.         programmers.insert(diffs[i]);
  71.         programmersSum += skills[diffs[i].second].first;
  72.     }
  73.  
  74.     int M;
  75.     std::cin >> M;
  76.     for (size_t i = 0; i < M; ++i)
  77.     {
  78.         int num, type, d;
  79.         std::cin >> num >> type >> d;
  80.  
  81.         num -= 1;
  82.  
  83.         auto a = skills[num].first, b = skills[num].second;
  84.         int newA = a, newB = b;
  85.         if (type == 1)
  86.             newA += d;
  87.         else
  88.             newB += d;
  89.  
  90.         skills[num] = {newA, newB};
  91.        
  92.         std::pair<int, int> key(a - b, num);
  93.         std::pair<int, int> newKey(newA - newB, num);
  94.  
  95.         if (auto it = programmers.find(key); it != programmers.end())
  96.         {
  97.             programmers.erase(*it);
  98.             programmersSum -= a;
  99.  
  100.             auto bestManager = *(managers.rbegin());
  101.             if (bestManager.first < newKey.first)
  102.             {
  103.                 programmers.insert(newKey);
  104.                 programmersSum += newA;
  105.             }
  106.             else
  107.             {
  108.                 managers.erase(bestManager);
  109.                 managersSum -= skills[bestManager.second].second;
  110.                 managers.insert(newKey);
  111.                 managersSum += newB;
  112.                
  113.                 programmers.insert(bestManager);
  114.                 programmersSum += skills[bestManager.second].first;
  115.             }
  116.         }
  117.         else if (auto it = managers.find(key); it != managers.end())
  118.         {
  119.             managers.erase(*it);
  120.             managersSum -= b;
  121.  
  122.             auto worstProgrammer = *(programmers.begin());
  123.             if (worstProgrammer.first > newKey.first)
  124.             {
  125.                 managers.insert(newKey);
  126.                 managersSum += newB;
  127.             }
  128.             else
  129.             {
  130.                 programmers.erase(worstProgrammer);
  131.                 programmersSum -= skills[worstProgrammer.second].first;
  132.                 programmers.insert(newKey);
  133.                 programmersSum += newA;
  134.                
  135.                 managers.insert(worstProgrammer);
  136.                 managersSum -= skills[worstProgrammer.second].second;
  137.             }
  138.         }
  139.         else
  140.             return 1;
  141.  
  142.         std::cout << programmersSum + managersSum << '\n';
  143.     }
  144.        
  145.     return 0;
  146. }
Advertisement
Add Comment
Please, Sign In to add comment