제출 #107939

#제출 시각아이디문제언어결과실행 시간메모리
107939someone_aaPinball (JOI14_pinball)C++17
100 / 100
797 ms99472 KiB
#include <bits/stdc++.h> #define ll long long #define pb push_back #define mp make_pair #define P pair<ll,ll> using namespace std; const int maxn = 100100; const ll inf = (1LL<<50); int n, m; ll a[maxn], b[maxn],c[maxn], d[maxn], br; set<ll>st; map<ll,int>ind; P tree[12*maxn]; ll dpl[maxn], dpr[maxn]; class node { public: P value = mp(inf, inf); ll lbound, rbound; node *lchild, *rchild; node(ll _lb, ll _rb) { lchild = rchild = NULL; lbound = _lb; rbound = _rb; } P lvalue() { if(lchild == NULL) return mp(inf, inf); else return lchild->value; } P rvalue() { if(rchild == NULL) return mp(inf, inf); else return rchild->value; } void update(int uind, bool type, ll val) { if(lbound == rbound) { if(type == 0) value.first = min(value.first, val); else value.second = min(value.second, val); } else { int mid = (lbound + rbound) / 2; if(uind <= mid) { if(lchild == NULL) lchild = new node(lbound, mid); lchild -> update(uind, type, val); } else { if(rchild == NULL) rchild = new node(mid+1, rbound); rchild -> update(uind, type, val); } P lval = lvalue(); P rval = rvalue(); value.first = min(lval.first, rval.first); value.second = min(lval.second, rval.second); } } P query(int ql, int qr) { if(lbound > qr || rbound < ql) return mp(inf, inf); else if(lbound >= ql && rbound <= qr) return value; else { P lval, rval; if(lchild == NULL) lval = mp(inf, inf); else lval = lchild -> query(ql, qr); if(rchild == NULL) rval = mp(inf, inf); else rval = rchild -> query(ql, qr); return mp(min(lval.first, rval.first), min(lval.second, rval.second)); } } }; int main() { cin>>n>>m; for(int i=0;i<n;i++) { cin>>a[i]>>b[i]>>c[i]>>d[i]; } node *root = new node(1, m); ll result = LLONG_MAX; for(int i=0;i<n;i++) { // O(N^2) algorithm /*dpl[i] = dpr[i] = inf; if(a[i] == 1) { dpl[i] = d[i]; } if(b[i] == m) { dpr[i] = d[i]; } for(int j=0;j<i;j++) { if(c[j] >= a[i] && c[j] <= b[i]) { dpl[i] = min(dpl[i], dpl[j] + d[i]); dpr[i] = min(dpr[i], dpr[j] + d[i]); } }*/ // O(NlogN) algorithm, doesn't work //cout<<i<<":\n"; if(a[i] == 1) { dpl[i] = d[i]; root->update(c[i], 0, dpl[i]); } else { P X = root->query(a[i], b[i]); dpl[i] = X.first + d[i]; //cout<<X.first<<"\n"; root->update(c[i], 0, dpl[i]); } if(b[i] == m) { dpr[i] = d[i]; root->update(c[i], 1, dpr[i]); } else { P X = root->query(a[i], b[i]); if(X.second == inf) dpr[i] = inf; else dpr[i] = X.second + d[i]; root->update(c[i], 1, dpr[i]); } //cout<<dpl[i]<<" + "<<dpr[i]<<" - "<<d[i]<<"\n"; result = min(result, dpl[i] + dpr[i] - d[i]); } if(result >= inf) { cout<<"-1\n"; } else { cout<<result<<"\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...