shushus

Спринт 13. Конструкторы для продвинутых.

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