Advertisement
Derga

Untitled

Jul 8th, 2023 (edited)
673
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.60 KB | None | 0 0
  1. #include <iostream>
  2. #include <queue>
  3. #include <cstdint>
  4. #include <set>
  5. #include <string>
  6. #include <tuple>
  7. #include <vector>
  8.  
  9. using namespace std;
  10.  
  11. struct Datacenter {
  12.     int reboots_count = 0;
  13.     vector<bool> is_server_enabled;
  14.     vector<int> disabled_servers_idxs;
  15.     Datacenter(int servers_count) : is_server_enabled(servers_count + 1, true) {}
  16.  
  17.     int64_t GetScore() {
  18.         int servers_count = is_server_enabled.size() - 1;
  19.         return (int64_t)reboots_count *
  20.             ((int64_t)servers_count - disabled_servers_idxs.size());
  21.     }
  22.  
  23.     void Reset() {
  24.         reboots_count++;
  25.         for (auto idx : disabled_servers_idxs) {
  26.             is_server_enabled[idx] = true;
  27.         }
  28.         disabled_servers_idxs.clear();
  29.     }
  30.  
  31.     void Disable(int idx) {
  32.         if (is_server_enabled[idx]) {
  33.             is_server_enabled[idx] = false;
  34.             disabled_servers_idxs.push_back(idx);
  35.         }
  36.     }
  37. };
  38.  
  39. struct ScoreIdxReboots {
  40.     int64_t score;
  41.     int idx;
  42.     int reboots_count;
  43. };
  44.  
  45. auto scores_max_cmp_set = [](const auto& lhs, const auto& rhs) {
  46.     return tie(rhs.score, lhs.idx) < tie(lhs.score, rhs.idx);
  47. };
  48.  
  49. auto scores_min_cmp_set = [](const auto& lhs, const auto& rhs) {
  50.     return tie(lhs.score, lhs.idx) < tie(rhs.score, rhs.idx);
  51. };
  52.  
  53. void Solution1(vector<Datacenter>& datacenters, int requests_count) {
  54.     set<ScoreIdxReboots, decltype(scores_max_cmp_set)> max_idx;
  55.     set<ScoreIdxReboots, decltype(scores_min_cmp_set)> min_idx;
  56.     for (int i = 1; i < (int)datacenters.size(); i++) {
  57.         max_idx.insert({ 0, i, 0 });
  58.         min_idx.insert({ 0, i, 0 });
  59.     }
  60.  
  61.     for (int i = 0; i < requests_count; ++i) {
  62.         string operation;
  63.         cin >> operation;
  64.         if (operation == "GETMAX") {
  65.             cout << max_idx.begin()->idx << '\n';
  66.             continue;
  67.         }
  68.  
  69.         if (operation == "GETMIN") {
  70.             cout << min_idx.begin()->idx << '\n';
  71.             continue;
  72.         }
  73.  
  74.         int datacenter_idx;
  75.         cin >> datacenter_idx;
  76.         auto& datacenter = datacenters[datacenter_idx];
  77.         int64_t last_score = datacenter.GetScore();
  78.         int last_reboots_count = datacenter.reboots_count;
  79.  
  80.         if (operation == "RESET") {
  81.             datacenter.Reset();
  82.         } else {
  83.             int server_idx;
  84.             cin >> server_idx;
  85.             datacenter.Disable(server_idx);
  86.         }
  87.  
  88.         int64_t new_score = datacenter.GetScore();
  89.         max_idx.erase({ last_score, datacenter_idx, last_reboots_count });
  90.         min_idx.erase({ last_score, datacenter_idx, last_reboots_count });
  91.         max_idx.insert({ new_score, datacenter_idx, datacenter.reboots_count });
  92.         min_idx.insert({ new_score, datacenter_idx, datacenter.reboots_count });
  93.     }
  94. }
  95.  
  96. bool IsScoreUpToDate(vector<Datacenter>& datacenters, const ScoreIdxReboots& elem) {
  97.     int idx = elem.idx;
  98.     return datacenters[idx].GetScore() == elem.score;
  99. }
  100.  
  101. bool IsRebootsCountUpToDate(vector<Datacenter>& datacenters, const ScoreIdxReboots& elem) {
  102.     int idx = elem.idx;
  103.     return datacenters[idx].reboots_count == elem.reboots_count;
  104. }
  105.  
  106. template <typename PQ>
  107. void DeleteExpiredScores(vector<Datacenter>& datacenters, PQ& scores) {
  108.     while (!scores.empty() && !IsScoreUpToDate(datacenters, scores.top()) || !IsRebootsCountUpToDate(datacenters, scores.top())) {
  109.         scores.pop();
  110.     }
  111. }
  112.  
  113. auto scores_max_cmp_queue = [](const auto& lhs, const auto& rhs) {
  114.     return tie(lhs.score, rhs.idx) < tie(rhs.score, lhs.idx);
  115. };
  116.  
  117. auto scores_min_cmp_queue = [](const auto& lhs, const auto& rhs) {
  118.     return tie(rhs.score, rhs.idx) < tie(lhs.score, lhs.idx);
  119. };
  120.  
  121. void Solution2(vector<Datacenter>& datacenters, int requests_count) {
  122.     priority_queue<ScoreIdxReboots, vector<ScoreIdxReboots>, decltype(scores_max_cmp_queue)> scores_max(scores_max_cmp_queue); //score, idx, reboots_count
  123.     priority_queue<ScoreIdxReboots, vector<ScoreIdxReboots>, decltype(scores_min_cmp_queue)> scores_min(scores_min_cmp_queue); //score, idx, reboots_count
  124.     for (int i = 1; i < (int)datacenters.size(); i++) {
  125.         scores_max.push({ 0, i, 0 });
  126.         scores_min.push({ 0, i, 0 });
  127.     }
  128.  
  129.     for (int i = 0; i < requests_count; ++i) {
  130.         string operation;
  131.         cin >> operation;
  132.         if (operation == "GETMAX") {
  133.             DeleteExpiredScores(datacenters, scores_max);
  134.             cout << scores_max.top().idx << '\n';
  135.             continue;
  136.         }
  137.  
  138.         if (operation == "GETMIN") {
  139.             DeleteExpiredScores(datacenters, scores_min);
  140.             cout << scores_min.top().idx << '\n';
  141.             continue;
  142.         }
  143.  
  144.         int datacenter_idx;
  145.         cin >> datacenter_idx;
  146.         auto& datacenter = datacenters[datacenter_idx];
  147.         int64_t last_score = datacenter.GetScore();
  148.         if (operation == "RESET") {
  149.             datacenter.Reset();
  150.         } else {
  151.             int server_idx;
  152.             cin >> server_idx;
  153.             datacenter.Disable(server_idx);
  154.         }
  155.         int64_t new_score = datacenter.GetScore();
  156.         scores_max.push({ new_score, datacenter_idx, datacenter.reboots_count });
  157.         scores_min.push({ new_score, datacenter_idx, datacenter.reboots_count });
  158.     }
  159. }
  160.  
  161. int main() {
  162.     ios_base::sync_with_stdio(false);
  163.     cin.tie(nullptr);
  164.  
  165.     int datacenters_count, servers_count, requests_count;
  166.     cin >> datacenters_count >> servers_count >> requests_count;
  167.     vector<Datacenter> datacenters(datacenters_count + 1, Datacenter(servers_count));
  168.     //Solution1(datacenters, requests_count);
  169.     Solution2(datacenters, requests_count);
  170.  
  171.     return 0;
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement