Advertisement
kutuzzzov

Урок 4 функция против метода

Jun 11th, 2023
965
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.56 KB | None | 0 0
  1. #include <iomanip>
  2. #include <iostream>
  3. #include <vector>
  4. #include <utility>
  5. #include <map>
  6.  
  7. using namespace std;
  8.  
  9. class ReadingManager {
  10. public:
  11.     ReadingManager() :
  12.         user_page_counts_(MAX_USER_COUNT_ + 1, 0),
  13.         num_users_(0) {}
  14.  
  15.  
  16.     void Read(int user_id, int page_count) {
  17.         int prev_page_count = user_page_counts_[user_id];
  18.         if (!prev_page_count) {
  19.             num_users_++;
  20.         }
  21.         else {
  22.             auto it = page_to_num_users_.find(prev_page_count);
  23.             if (it->second == 1)
  24.                 page_to_num_users_.erase(it);
  25.             else
  26.                 it->second--;
  27.         }
  28.         user_page_counts_[user_id] = page_count;
  29.         page_to_num_users_[page_count]++;
  30.     }
  31.  
  32.     double Cheer(int user_id) const {
  33.         int page_count = user_page_counts_[user_id];
  34.         if (!page_count)
  35.             return 0;
  36.         if (num_users_ == 1)
  37.             return 1;
  38.         int num_users_with_less_pages = 0;
  39.         for (auto& p : page_to_num_users_) {
  40.             if (p.first >= page_count)
  41.                 break;
  42.             num_users_with_less_pages += p.second;
  43.         }
  44.         // По умолчанию деление целочисленное, поэтому
  45.         // нужно привести числитель к типу double.
  46.         // Простой способ сделать это — умножить его на 1.0.
  47.         return (num_users_with_less_pages) * 1.0 / (num_users_ - 1);
  48.     }
  49.  
  50. private:
  51.     // Статическое поле не принадлежит какому-то конкретному
  52.     // объекту класса. По сути это глобальная переменная,
  53.     // в данном случае константная.
  54.     // Будь она публичной, к ней можно было бы обратиться снаружи
  55.     // следующим образом: ReadingManager::MAX_USER_COUNT.
  56.     static const int MAX_USER_COUNT_ = 100'000;
  57.  
  58.     vector<int> user_page_counts_;
  59.     map<int, int> page_to_num_users_;
  60.     unsigned int num_users_;
  61. };
  62.  
  63.  
  64. int main() {
  65.     // Для ускорения чтения данных отключается синхронизация
  66.     // cin и cout с stdio,
  67.     // а также выполняется отвязка cin от cout
  68.     ios::sync_with_stdio(false);
  69.     cin.tie(nullptr);
  70.  
  71.     ReadingManager manager;
  72.  
  73.     int query_count;
  74.     cin >> query_count;
  75.  
  76.     for (int query_id = 0; query_id < query_count; ++query_id) {
  77.         string query_type;
  78.         cin >> query_type;
  79.         int user_id;
  80.         cin >> user_id;
  81.  
  82.         if (query_type == "READ") {
  83.             int page_count;
  84.             cin >> page_count;
  85.             manager.Read(user_id, page_count);
  86.         } else if (query_type == "CHEER") {
  87.             cout << setprecision(6) << manager.Cheer(user_id) << "\n";
  88.         }
  89.     }
  90.  
  91.     return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement