Advertisement
kutuzzzov

Урок 3 конструкторы для продвинутых

Jun 27th, 2023
1,154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.70 KB | None | 0 0
  1. #include <algorithm>
  2. #include <cmath>
  3. #include <iostream>
  4. #include <map>
  5. #include <string>
  6. #include <vector>
  7. #include <set>
  8.  
  9. using namespace std;
  10.  
  11. class RouteManager {
  12. public:
  13.     void AddRoute(int start, int finish) {
  14.         reachable_lists_[start].insert(finish);
  15.         reachable_lists_[finish].insert(start);
  16.     }
  17.     int FindNearestFinish(int start, int finish) const {
  18.         int result = abs(start - finish);
  19.         if (reachable_lists_.count(start) < 1) {
  20.             return result;
  21.         }
  22.         const set<int>& reachable_stations = reachable_lists_.at(start);
  23.         if (!reachable_stations.empty()) {
  24.             const auto it = reachable_stations.lower_bound(finish);
  25.             if (it == reachable_stations.begin()) {
  26.                 return min(result, abs(finish - *it));
  27.             }
  28.             const auto prev_it = std::prev(it);
  29.             if (it == reachable_stations.end() || abs(finish - *prev_it) <= abs(finish - *it)) {
  30.                 return min(result, abs(finish - *prev_it));
  31.             }
  32.             else {
  33.                 return min(result, abs(*it - finish));
  34.             }
  35.         }
  36.         return result;
  37.     }
  38.  
  39. private:
  40.     map<int, set<int>> reachable_lists_;
  41. };
  42.  
  43. int main() {
  44.     RouteManager routes;
  45.  
  46.     int query_count;
  47.     cin >> query_count;
  48.  
  49.     for (int query_id = 0; query_id < query_count; ++query_id) {
  50.         string query_type;
  51.         cin >> query_type;
  52.         int start, finish;
  53.         cin >> start >> finish;
  54.         if (query_type == "ADD"s) {
  55.             routes.AddRoute(start, finish);
  56.         } else if (query_type == "GO"s) {
  57.             cout << routes.FindNearestFinish(start, finish) << "\n"s;
  58.         }
  59.     }
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement