Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- using ll = long long;
- constexpr int N = 1e6 + 5;
- constexpr ll Inf = 1e17;
- int n, L;
- int l[N], r[N], v[N];
- vector<int> s;
- vector<pair<int, int>> adj[N];
- ll d[N];
- void Read()
- {
- cin >> n >> L;
- for (int i = 1; i <= n; ++i)
- {
- int x, d, p, t;
- cin >> x >> d >> t >> p;
- l[i] = x - p;
- r[i] = x + d;
- v[i] = t + p;
- s.emplace_back(l[i]);
- s.emplace_back(r[i]);
- }
- }
- ll Dijkstra(int x, int y)
- {
- fill_n(d, N, Inf);
- struct Tque
- {
- int v;
- ll w;
- Tque(int v = 0, ll w = 0) : v(v), w(w) {}
- bool operator<(const Tque &a) const
- {
- return w > a.w;
- }
- };
- priority_queue<Tque> q;
- q.emplace(x, d[x] = 0);
- while (!q.empty())
- {
- Tque c = q.top();
- q.pop();
- if (d[c.v] != c.w)
- continue;
- for (auto i : adj[c.v])
- if (d[i.first] > c.w + i.second)
- q.emplace(i.first, d[i.first] = c.w + i.second);
- }
- return d[y];
- }
- #define Find(x, v) (lower_bound(x.begin(), x.end(), v) - x.begin() + 1)
- void Solve()
- {
- s.emplace_back(0);
- s.emplace_back(L);
- sort(s.begin(), s.end());
- s.resize(unique(s.begin(), s.end()) - s.begin());
- for (int i = 0; i < (int)s.size() - 1; ++i)
- {
- adj[i + 1].emplace_back(i + 2, s[i + 1] - s[i]);
- adj[i + 2].emplace_back(i + 1, s[i + 1] - s[i]);
- }
- for (int i = 1; i <= n; ++i)
- adj[Find(s, l[i])].emplace_back(Find(s, r[i]), v[i]);
- cout << Dijkstra(1, s.size());
- }
- int32_t main()
- {
- ios::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- Read();
- Solve();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement