제출 #282859

#제출 시각아이디문제언어결과실행 시간메모리
282859oolimryPinball (JOI14_pinball)C++14
51 / 100
959 ms524292 KiB
#include <bits/stdc++.h> #define all(x) (x).begin(), (x).end() #define sz(x) (int) (x).size() #define L first #define R second using namespace std; typedef long long lint; typedef pair<int,int> ii; const lint inf = 1e17; struct node{ int s, e, m; lint val; node *l = nullptr, *r = nullptr; node(int S, int E){ s = S, e = E, m = (s+e)/2; val = inf; } void create(){ if(s != e){ l = new node(s,m); r = new node(m+1,e); } } void update(int P, lint V){ val = min(val, V); if(s == e) return; else if(P <= m){ if(l == nullptr) create(); l->update(P,V); } else{ if(r == nullptr) create(); r->update(P,V); } } lint query(int S, int E){ if(s == S && E == e) return val; else{ if(l == nullptr) create(); if(E <= m) return l->query(S,E); else if(S >= m+1) return r->query(S,E); else return min(l->query(S,m), r->query(m+1,E)); } } } *Left, *Right; int main(){ ios_base::sync_with_stdio(false); cin.tie(0); int n, len; cin >> n >> len; Left = new node(1, len), Right = new node(1, len); Left->update(1, 0); Right->update(len, 0); lint ans = inf; for(int i = 0;i < n;i++){ int L, R, M, cost; cin >> L >> R >> M >> cost; lint fromLeft = Left->query(L, R); lint fromRight = Right->query(L, R); ans = min(ans, fromLeft + fromRight + cost); Left->update(M, fromLeft + cost); Right->update(M, fromRight + cost); } if(ans == inf) ans = -1; cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...