Advertisement
Derga

Untitled

Jul 7th, 2023
852
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.74 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_enable;
  14.     vector<int> disabled_servers_idxs;
  15.     Datacenter(int servers_count) : is_server_enable(servers_count + 1, true) {}
  16. };
  17.  
  18. /*
  19. //подумать, как использовать одну структуру и два разных компаратора. Наследование?
  20.     struct ScoreMax {
  21.         int64_t score;
  22.         int idx;
  23.         int reboots_count;
  24.     };
  25.  
  26.     struct ScoreMin {
  27.         int64_t score;
  28.         int idx;
  29.         int reboots_count;
  30.     };
  31.  
  32.     bool operator < (const ScoreMax& lhs, const ScoreMax& rhs) {
  33.         if (lhs.score != rhs.score) {
  34.             return lhs.score > rhs.score;
  35.         }
  36.         return lhs.idx < rhs.idx;
  37.     }
  38.  
  39.     bool operator < (const ScoreMin& lhs, const ScoreMin& rhs) {
  40.         return tie(lhs.score, lhs.idx) < tie(rhs.score, rhs.idx);
  41.     }
  42.  
  43. void Solution1(int datacenters_count, int servers_count, int requests_count) {
  44.     vector<Datacenter> datacenters(datacenters_count + 1, Datacenter(servers_count));
  45.  
  46.     set<MaxScoreIdx> max_idx;
  47.     set<MinScoreIdx> min_idx;
  48.     for (int i = 1; i <= datacenters_count; i++) {
  49.         max_idx.insert({ 0, i });
  50.         min_idx.insert({ 0, i });
  51.     }
  52.  
  53.     auto get_score = [&datacenters, servers_count](int idx) {
  54.         return (int64_t)datacenters[idx].reboots_count *
  55.             (int64_t)(servers_count - (int64_t)datacenters[idx].disabled_servers_idxs.size());
  56.     };
  57.  
  58.     for (int i = 0; i < requests_count; ++i) {
  59.         string operation;
  60.         cin >> operation;
  61.         if (operation == "GETMAX") {
  62.             cout << max_idx.begin()->idx << '\n';
  63.             continue;
  64.         }
  65.  
  66.         if (operation == "GETMIN") {
  67.             cout << min_idx.begin()->idx << '\n';
  68.             continue;
  69.         }
  70.  
  71.         int datacenter_idx;
  72.         cin >> datacenter_idx;
  73.         int64_t last_score = get_score(datacenter_idx);
  74.  
  75.         auto& datacenter = datacenters[datacenter_idx];
  76.         if (operation == "RESET") {
  77.             datacenter.reboots_count++;
  78.             for (auto idx : datacenter.disabled_servers_idxs) {
  79.                 datacenter.is_server_enable[idx] = true;
  80.             }
  81.             datacenter.disabled_servers_idxs.clear();
  82.         } else {
  83.             int server_idx;
  84.             cin >> server_idx;
  85.             if (datacenter.is_server_enable[server_idx]) {
  86.                 datacenter.is_server_enable[server_idx] = false;
  87.                 datacenter.disabled_servers_idxs.push_back(server_idx);
  88.             }
  89.         }
  90.  
  91.         int64_t new_score = get_score(datacenter_idx);
  92.         max_idx.erase({ last_score, datacenter_idx });
  93.         min_idx.erase({ last_score, datacenter_idx });
  94.         max_idx.insert({ new_score, datacenter_idx });
  95.         min_idx.insert({ new_score, datacenter_idx });
  96.     }
  97. }
  98. */
  99.  
  100. struct ScoreIdxReboots {
  101.     int64_t score;
  102.     int idx;
  103.     int reboots_count;
  104. };
  105.  
  106. int64_t GetScore(vector<Datacenter>& datacenters, int idx) {
  107.     const auto& datacenter = datacenters[idx];
  108.     int servers_count = datacenter.is_server_enable.size() - 1;
  109.     return (int64_t)datacenter.reboots_count *
  110.         ((int64_t)servers_count - datacenter.disabled_servers_idxs.size());
  111. }
  112.  
  113. template <typename PQ>
  114. bool IsScoreUpToDate(vector<Datacenter>& datacenters, const PQ& scores) {
  115.     int idx = scores.top().idx;
  116.     return GetScore(datacenters, idx) == scores.top().score;
  117. }
  118.  
  119. template <typename PQ>
  120. bool IsRebootsCountUpToDate(vector<Datacenter>& datacenters, const PQ& scores) {
  121.     int idx = scores.top().idx;
  122.     return datacenters[idx].reboots_count == scores.top().reboots_count;
  123. }
  124.  
  125.  
  126. template <typename PQ>
  127. void DeleteExpiredScores(vector<Datacenter>& datacenters, PQ& scores) {
  128.     while (!IsScoreUpToDate(datacenters, scores) || !IsRebootsCountUpToDate(datacenters, scores)) {
  129.         scores.pop();
  130.     }
  131. }
  132.  
  133. void Solution2(int datacenters_count, int servers_count, int requests_count) {
  134.     vector<Datacenter> datacenters(datacenters_count + 1, Datacenter(servers_count));
  135.  
  136.     auto scores_max_cmp = [] (const auto& lhs, const auto& rhs) {
  137.         if (lhs.score != rhs.score) {
  138.             return lhs.score < rhs.score;
  139.         }
  140.         return lhs.idx > rhs.idx;
  141.     };
  142.  
  143.     auto scores_min_cmp = [](const auto& lhs, const auto& rhs) {
  144.         return tie(lhs.score, lhs.idx) > tie(rhs.score, rhs.idx);
  145.     };
  146.  
  147.     priority_queue<ScoreIdxReboots,vector<ScoreIdxReboots>, decltype(scores_max_cmp)> scores_max(scores_max_cmp); //score, idx, reboots_count
  148.     priority_queue<ScoreIdxReboots,vector<ScoreIdxReboots>, decltype(scores_min_cmp)> scores_min(scores_min_cmp); //score, idx, reboots_count
  149.     for (int i = 1; i <= datacenters_count; i++) {
  150.         scores_max.push({ 0, i, 0 });
  151.         scores_min.push({ 0, i, 0 });
  152.     }  
  153.    
  154.     for (int i = 0; i < requests_count; ++i) {
  155.         string operation;
  156.         cin >> operation;
  157.         if (operation == "GETMAX") {
  158.             DeleteExpiredScores(datacenters, scores_max);
  159.             cout << scores_max.top().idx << '\n';
  160.             continue;
  161.         }
  162.  
  163.         if (operation == "GETMIN") {
  164.             DeleteExpiredScores(datacenters, scores_min);
  165.             cout << scores_min.top().idx << '\n';
  166.             continue;
  167.         }
  168.  
  169.         int datacenter_idx;
  170.         cin >> datacenter_idx;
  171.         int64_t last_score = GetScore(datacenters, datacenter_idx);
  172.  
  173.         auto& datacenter = datacenters[datacenter_idx];
  174.         if (operation == "RESET") {
  175.             datacenter.reboots_count++;
  176.             for (auto idx : datacenter.disabled_servers_idxs) {
  177.                 datacenter.is_server_enable[idx] = true;
  178.             }
  179.             datacenter.disabled_servers_idxs.clear();
  180.         } else {
  181.             int server_idx;
  182.             cin >> server_idx;
  183.             if (datacenter.is_server_enable[server_idx]) {
  184.                 datacenter.is_server_enable[server_idx] = false;
  185.                 datacenter.disabled_servers_idxs.push_back(server_idx);
  186.             }
  187.         }
  188.         int64_t new_score = GetScore(datacenters, datacenter_idx);
  189.         scores_max.push({ new_score, datacenter_idx, datacenter.reboots_count });
  190.         scores_min.push({ new_score, datacenter_idx, datacenter.reboots_count });
  191.     }
  192. }
  193.  
  194. int main() {
  195.     ios_base::sync_with_stdio(false);
  196.     cin.tie(nullptr);
  197.  
  198.     int datacenters_count, servers_count, requests_count;
  199.     cin >> datacenters_count >> servers_count >> requests_count;
  200.     //Solution1(datacenters_count, servers_count, requests_count);
  201.     Solution2(datacenters_count, servers_count, requests_count);
  202.    
  203.     return 0;
  204. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement