Advertisement
skaram

Untitled

Mar 12th, 2024
543
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.74 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #ifndef Local
  4. #define debug(...) 1337
  5. #define endl '\n'
  6. #endif
  7.  
  8. using namespace std;
  9.  
  10. #define int long long
  11.  
  12. typedef long long ll;
  13. typedef long double ld;
  14.  
  15. #define all(x) (x).begin(), (x).end()
  16. #define sz(x) (int)(x).size()
  17.  
  18. template<class A, class B>
  19. bool smin(A &x, B &&y) {
  20.         if (x > y) {
  21.                 x = y;
  22.                 return true;
  23.         }
  24.         return false;
  25. }
  26.  
  27. template<class A, class B>
  28. bool smax(A &x, B &&y) {
  29.         if (x < y) {
  30.                 x = y;
  31.                 return true;
  32.         }
  33.         return false;
  34. }
  35.  
  36. const int inf = 1e18;
  37.  
  38. struct segTree {
  39.         static const int maxn = 512 * 1024;
  40.         int t[2 * maxn - 1]{};
  41.  
  42.         void upd(int i, int c) {
  43.                 i += maxn - 1;
  44.                 t[i] = c;
  45.                 while (i) {
  46.                         i = (i - 1) / 2;
  47.                         t[i] = min(t[2 * i + 1], t[2 * i + 2]);
  48.                 }
  49.         }
  50.  
  51.         int lq, rq;
  52.  
  53.         int get(int i, int l, int r) {
  54.                 if (lq <= l && r <= rq)
  55.                         return t[i];
  56.                 int m = (l + r) / 2;
  57.                 int x = inf;
  58.                 if (lq < m)
  59.                         x = get(2 * i + 1, l, m);
  60.                 if (m < rq)
  61.                         smin(x, get(2 * i + 2, m, r));
  62.                 return x;
  63.         }
  64.  
  65.         int get(int l, int r) {
  66.                 lq = l, rq = r;
  67.                 return get(0, 0, maxn);
  68.         }
  69. };
  70.  
  71. void solve() {
  72.         int n, m;
  73.         cin >> m >> n;
  74.         vector<vector<pair<int, int>>> s(n + 2), t(n + 2);
  75.         for (int i = 0, l, r, c; i < m; ++i) {
  76.                 cin >> l >> r >> c;
  77.                 s[r].emplace_back(l, c);
  78.                 t[l].emplace_back(r, c);
  79.         }
  80.  
  81.         vector<int> dp(n + 2, inf), pd(n + 2, inf);
  82.         segTree st, ts;
  83.         st.upd(0, 0);
  84.         ts.upd(n + 1, 0);
  85.         dp[0] = 0, pd[n + 1] = 0;
  86.  
  87.         for (int i = 1; i <= n; ++i) {
  88.                 for (auto &[j, c]: s[i])
  89.                         smin(dp[i], st.get(j - 1, i) + c);
  90.                 st.upd(i, dp[i]);
  91.         }
  92.  
  93.         for (int i = n; i >= 1; --i){
  94.                 for (auto& [j, c] : t[i])
  95.                         smin(pd[i], ts.get(i + 1, j + 2) + c);
  96.                 ts.upd(i, pd[i]);
  97.         }
  98.  
  99.         debug(dp);
  100.         debug(pd);
  101.  
  102.         int ans = inf;
  103.         for (int i = 1; i <= n; ++i)
  104.                 smin(ans, dp[i - 1] + pd[i + 1]);
  105.         if (ans == inf)
  106.                 ans = -1;
  107.         cout << ans << endl;
  108. }
  109.  
  110. signed main() {
  111.         ios::sync_with_stdio(false), cin.tie(nullptr);
  112.  
  113.         int tt = 1;
  114. //        cin >> tt;
  115.         while (tt--)
  116.                 solve();
  117.  
  118.         return 0;
  119. }
  120.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement