Advertisement
Dang_Quan_10_Tin

MEETING POINT

Aug 7th, 2021
1,171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.56 KB | None | 0 0
  1. #pragma GCC target("avx2")
  2. #pragma GCC optimization("O3")
  3. #pragma GCC optimization("unroll-loops")
  4. #include <bits/stdc++.h>
  5.  
  6. using namespace std;
  7. using ll = long long;
  8. using ld = long double;
  9. using ull = unsigned long long;
  10.  
  11. template <class T>
  12. void read(T &x)
  13. {
  14.     x = 0;
  15.     register int c;
  16.     while ((c = getchar()) && (c > '9' || c < '0'))
  17.         ;
  18.     for (; c >= '0' && c <= '9'; c = getchar())
  19.         x = x * 10 + c - '0';
  20. }
  21.  
  22. constexpr bool typetest = 0;
  23. constexpr int N = 1e5 + 5;
  24. constexpr ll Inf = 1e17;
  25. int n, m, k, x[N];
  26. vector<pair<int, ll>> adj[N];
  27. ll d[2][N], f[N], g[N];
  28.  
  29. void Read()
  30. {
  31.     //cin >> n >> m >> k;
  32.   read(n);
  33.   read(m);
  34.   read(k);
  35.   for (int i = 1; i <= m; ++i)
  36.     {
  37.         int u, v;
  38.         ll w;
  39.         //cin >> u >> v >> w;
  40.         read(u), read(v), read(w);
  41.         adj[u].emplace_back(v, w);
  42.         adj[v].emplace_back(u, w);
  43.     }
  44. }
  45.  
  46. void Dijkstra(int x, ll d[N])
  47. {
  48.     fill_n(d, N, Inf);
  49.     d[x] = 0;
  50.     struct Tque
  51.     {
  52.         int v;
  53.         ll w;
  54.         Tque(int v = 0, ll w = 0) : v(v), w(w) {}
  55.         bool operator<(const Tque &a) const
  56.         {
  57.             return w > a.w;
  58.         }
  59.     };
  60.     priority_queue<Tque> s;
  61.     s.emplace(x, 0);
  62.  
  63.     while (!s.empty())
  64.     {
  65.         Tque c = s.top();
  66.         s.pop();
  67.         if (d[c.v] != c.w)
  68.             continue;
  69.  
  70.         for (auto i : adj[c.v])
  71.             if (d[i.first] > c.w + i.second)
  72.             {
  73.                 d[i.first] = c.w + i.second;
  74.                 s.emplace(i.first, d[i.first]);
  75.             }
  76.     }
  77. }
  78.  
  79. void Solve()
  80. {
  81.     Dijkstra(1, d[0]);
  82.     Dijkstra(n, d[1]);
  83.  
  84.     for (int i = 1; i <= n; ++i)
  85.         x[i] = i;
  86.  
  87.     sort(x + 1, x + n + 1, [&](const int &x, const int &y)
  88.          { return d[0][x] < d[0][y]; });
  89.  
  90.     f[0] = Inf;
  91.     for (int i = 1; i <= n; ++i)
  92.         f[i] = min(f[i - 1], d[1][x[i]]),
  93.         g[i] = d[0][x[i]];
  94.  
  95.     while (k--)
  96.     {
  97.         int a, b;
  98.         //cin >> a >> b;
  99.         read(a), read(b);  
  100.         int l = 1, mid, h = n;
  101.  
  102.         while (l <= h)
  103.         {
  104.             mid = (l + h) / 2;
  105.             if (mid == n || f[mid] * b < g[mid + 1] * a)
  106.                 h = mid - 1;
  107.             else
  108.                 l = mid + 1;
  109.         }
  110.  
  111.         cout << max(g[l] * a, f[l] * b) << "\n";
  112.     }
  113. }
  114.  
  115. int32_t main()
  116. {
  117.     ios::sync_with_stdio(0);
  118.     cin.tie(0);
  119.     cout.tie(0);
  120.     int t(1);
  121.     if (typetest)
  122.         cin >> t;
  123.     for (int _ = 1; _ <= t; ++_)
  124.     {
  125.         //cout << "Case #" << _ << "\n";
  126.         Read();
  127.         Solve();
  128.     }
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement