Submission #106261

#TimeUsernameProblemLanguageResultExecution timeMemory
106261popovicirobertPinball (JOI14_pinball)C++14
51 / 100
1067 ms2716 KiB
#include <bits/stdc++.h> #define lsb(x) (x & (-x)) #define ll long long #define ull unsigned long long // 217 // 44 using namespace std; const ll INF = 1e16; struct SegTree { struct Node { Node *st, *dr; ll mn; Node() { st = dr = NULL; mn = INF; } }; Node *root; inline void init() { root = new Node; } void update(Node *nod, int left, int right, int pos, ll val) { nod -> mn = min(nod -> mn, val); if(left < right) { int mid = (left + right) / 2; if(pos <= mid) { if(nod -> st == NULL) { nod -> st = new Node; } update(nod -> st, left, mid, pos, val); } else { if(nod -> dr == NULL) { nod -> dr = new Node; } update(nod -> dr, mid + 1, right, pos, val); } } } void update(int left, int right, int pos, ll val) { update(root, left, right, pos, val); } ll query(Node *nod, int left, int right, int l, int r) { if(nod == NULL) { return INF; } if(l <= left && right <= r) { return nod -> mn; } else { int mid = (left + right) / 2; ll ans = INF; ans = min(query(nod -> st, left, mid, l, r), query(nod -> dr, mid + 1, right, l, r)); return ans; } } ll query(int left, int right, int l, int r) { return query(root, left, right, l, r); } }; int main() { //ifstream cin("A.in"); //ofstream cout("A.out"); int i, n, m; ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); cin >> m >> n; SegTree st[3]; for(i = 1; i <= 2; i++) { st[i].init(); } vector < vector <ll> > dp(m + 1, vector<ll>(4, INF)); for(i = 1; i <= m; i++) { int l, r, pos; ll cst; cin >> l >> r >> pos >> cst; if(l == 1) { dp[i][1] = min(dp[i][1], cst); } if(r == n) { dp[i][2] = min(dp[i][2], cst); } if(l == 1 && r == n) { dp[i][3] = min(dp[i][3], cst); } dp[i][1] = min(dp[i][1], cst + st[1].query(1, n, l, r)); dp[i][2] = min(dp[i][2], cst + st[2].query(1, n, l, r)); dp[i][3] = min(dp[i][3], cst + st[1].query(1, n, l, r) + st[2].query(1, n, l, r)); dp[i][3] = min(dp[i][3], dp[i][1] + dp[i][2] - cst); for(int j = 1; j <= 2; j++) { st[j].update(1, n, pos, dp[i][j]); } } ll ans = INF; for(i = 1; i <= m; i++) { ans = min(ans, dp[i][3]); } if(ans == INF) { cout << -1; return 0; } cout << ans; //cin.close(); //cout.close(); 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...