Advertisement
Dang_Quan_10_Tin

RACE

Jul 9th, 2022
1,246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.78 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. using ll = long long;
  5.  
  6. constexpr int N = 1e6 + 5;
  7. constexpr ll Inf = 1e17;
  8.  
  9. int n, L;
  10.  
  11. int l[N], r[N], v[N];
  12. vector<int> s;
  13. vector<pair<int, int>> adj[N];
  14. ll d[N];
  15.  
  16. void Read()
  17. {
  18.     cin >> n >> L;
  19.  
  20.     for (int i = 1; i <= n; ++i)
  21.     {
  22.         int x, d, p, t;
  23.         cin >> x >> d >> t >> p;
  24.  
  25.         l[i] = x - p;
  26.         r[i] = x + d;
  27.         v[i] = t + p;
  28.  
  29.         s.emplace_back(l[i]);
  30.         s.emplace_back(r[i]);
  31.     }
  32. }
  33.  
  34. ll Dijkstra(int x, int y)
  35. {
  36.     fill_n(d, N, Inf);
  37.  
  38.     struct Tque
  39.     {
  40.         int v;
  41.         ll w;
  42.  
  43.         Tque(int v = 0, ll w = 0) : v(v), w(w) {}
  44.  
  45.         bool operator<(const Tque &a) const
  46.         {
  47.             return w > a.w;
  48.         }
  49.     };
  50.  
  51.     priority_queue<Tque> q;
  52.  
  53.     q.emplace(x, d[x] = 0);
  54.  
  55.     while (!q.empty())
  56.     {
  57.         Tque c = q.top();
  58.         q.pop();
  59.  
  60.         if (d[c.v] != c.w)
  61.             continue;
  62.  
  63.         for (auto i : adj[c.v])
  64.             if (d[i.first] > c.w + i.second)
  65.                 q.emplace(i.first, d[i.first] = c.w + i.second);
  66.     }
  67.  
  68.     return d[y];
  69. }
  70.  
  71. #define Find(x, v) (lower_bound(x.begin(), x.end(), v) - x.begin() + 1)
  72.  
  73. void Solve()
  74. {
  75.     s.emplace_back(0);
  76.     s.emplace_back(L);
  77.  
  78.     sort(s.begin(), s.end());
  79.     s.resize(unique(s.begin(), s.end()) - s.begin());
  80.  
  81.     for (int i = 0; i < (int)s.size() - 1; ++i)
  82.     {
  83.         adj[i + 1].emplace_back(i + 2, s[i + 1] - s[i]);
  84.         adj[i + 2].emplace_back(i + 1, s[i + 1] - s[i]);
  85.     }
  86.  
  87.     for (int i = 1; i <= n; ++i)
  88.         adj[Find(s, l[i])].emplace_back(Find(s, r[i]), v[i]);
  89.  
  90.     cout << Dijkstra(1, s.size());
  91. }
  92.  
  93. int32_t main()
  94. {
  95.     ios::sync_with_stdio(0);
  96.     cin.tie(0);
  97.     cout.tie(0);
  98.     Read();
  99.     Solve();
  100. }
  101.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement