Submission #1352778

#TimeUsernameProblemLanguageResultExecution timeMemory
1352778behradPinball (JOI14_pinball)C++20
100 / 100
166 ms20036 KiB
#ifdef LOCAL
#include "/home/bgopc/template/pch.hpp"
#endif
#include <bits/stdc++.h>
using namespace std;
// * No One Dies a Virgin, Life Fucks Us All
typedef long long ll;
#define nl '\n'
#define ff first
#define ss second
#define pb push_back
#define sik(x) {cout << x << nl; return;}
constexpr ll maxn = 1e5+10, mod = 1e9 + 7, inf = 1e17, SQ = 450, LG = 20;
typedef pair<int, int> pii;

int n, m, A[maxn], B[maxn], C[maxn];
ll segl[(3 * maxn) << 2], segr[(3 * maxn) << 2], D[maxn];
vector<int> comp;

void build(int l, int r, int id) {
  segl[id] = inf;
  segr[id] = inf;
  if (r - l == 1) return;

  int mid = (l + r) >> 1, lc = id << 1, rc = lc | 1;
  build(l, mid, lc);
  build(mid, r, rc);
}

void update(ll seg[], int p, ll x, int l = 1, int r = n+1, int id = 1) {
  if (r - l == 1) return void (seg[id] = min(seg[id], x));
  
  int mid = (l + r) >> 1, lc = id << 1, rc = lc | 1;
  if (p < mid) update(seg, p, x, l, mid, lc);
  else update(seg, p, x, mid, r, rc);
  seg[id] = min(seg[lc], seg[rc]);
}

ll get(ll seg[], int ql, int qr, int l = 1, int r = n+1, int id = 1) {
  if (ql <= l && r <= qr) return seg[id];
  if (qr <= l || r <= ql) return inf;
  int mid = (l + r) >> 1, lc = id << 1, rc = lc | 1;
  return min(get(seg, ql, qr, l, mid, lc), get(seg, ql, qr, mid, r, rc));
}

int32_t main() {
  cin.tie(0)->sync_with_stdio(0); 
  cin >> m >> n;
  comp.pb(0);
  comp.pb(1);
  comp.pb(n);
  for (int i = 1 ; i <= m ; i ++) {
    cin >> A[i] >> B[i] >> C[i] >> D[i];
    comp.pb(A[i]);
    comp.pb(B[i]);
    comp.pb(C[i]);
  }
  sort(comp.begin(), comp.end());
  comp.resize(unique(comp.begin(), comp.end()) - comp.begin());

  for (int i = 1 ; i <= m ; i ++) {
    A[i] = lower_bound(comp.begin(), comp.end(), A[i]) - comp.begin();
    B[i] = lower_bound(comp.begin(), comp.end(), B[i]) - comp.begin();
    C[i] = lower_bound(comp.begin(), comp.end(), C[i]) - comp.begin();
  }
  n = comp.size() - 1;
  build(1, n + 1, 1);

  ll ans = inf;
  for (int i = 1 ; i <= m ; i ++) {
    ll dpl = get(segl, A[i], B[i] + 1) + D[i];
    ll dpr = get(segr, A[i], B[i] + 1) + D[i];

    if (A[i] == 1) dpl = min(dpl, D[i]);
    if (B[i] == n) dpr = min(dpr, D[i]);

    if (A[i] == 1 && B[i] == n) ans = min(ans, D[i]);
    ans = min(ans, dpl + get(segr, A[i], B[i] + 1));
    ans = min(ans, dpr + get(segl, A[i], B[i] + 1));

    update(segl, C[i], dpl);
    update(segr, C[i], dpr);
  }
  cout << (ans >= inf ? -1 : ans) << nl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...