35657

Untitled

Sep 10th, 2023
804
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.85 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. #include <unordered_map>
  9.  
  10. using namespace std;
  11.  
  12. int  find_distance(const set<int>& reachable_stations, int finish) {
  13.     if (reachable_stations.size() == 1) {
  14.         return abs(finish - *reachable_stations.begin());
  15.     }
  16.  
  17.     auto it = lower_bound(reachable_stations.begin(), reachable_stations.end(), finish);
  18.     if (it == reachable_stations.end()) {
  19.         return abs(finish - *(--it));
  20.     }
  21.     if (it == reachable_stations.begin()) {
  22.         return abs(finish - *it);
  23.     }
  24.     return min(abs(finish - *it), abs(finish - *(it--)));
  25. }
  26.  
  27. class RouteManager {
  28. public:
  29.     void AddRoute(int start, int finish) {
  30.         reachable_lists_[start].insert(finish);
  31.         reachable_lists_[finish].insert(start);
  32.     }
  33.     int FindNearestFinish(int start, int finish) const {
  34.         int result = abs(start - finish);
  35.         auto it = reachable_lists_.find(start);
  36.         if (it == reachable_lists_.end()) {
  37.             return result;
  38.         }
  39.         const set<int>& reachable_stations = it->second;
  40.         if (!reachable_stations.empty()) {
  41.             result = min( result, find_distance(reachable_stations, finish));
  42.         }
  43.         return result;
  44.     }
  45.  
  46. private:
  47.     unordered_map<int, set<int>> reachable_lists_;
  48. };
  49.  
  50. int main() {
  51.     RouteManager routes;
  52.  
  53.     int query_count;
  54.     cin >> query_count;
  55.  
  56.     for (int query_id = 0; query_id < query_count; ++query_id) {
  57.         string query_type;
  58.         cin >> query_type;
  59.         int start, finish;
  60.         cin >> start >> finish;
  61.         if (query_type == "ADD"s) {
  62.             routes.AddRoute(start, finish);
  63.         } else if (query_type == "GO"s) {
  64.             cout << routes.FindNearestFinish(start, finish) << "\n"s;
  65.         }
  66.     }
  67. }
Advertisement
Comments
Add Comment
Please, Sign In to add comment