제출 #1291462

#제출 시각아이디문제언어결과실행 시간메모리
1291462Jawad_Akbar_JJPinball (JOI14_pinball)C++20
100 / 100
425 ms58384 KiB
#include <iostream> #include <map> using namespace std; #define int long long const int N = (1<<19) + 1, inf = 1e17; int Mn[2][N<<1], a[N], b[N], c[N], d[N], Mem[N], cur; map<int,int> mp, mp2; void insert(int t, int i, int vl, int cur = 1, int st = 1, int en = N){ if (i >= en or i < st) return; Mn[t][cur] = min(Mn[t][cur], vl); if (en - st == 1) return; int lc = cur + cur, rc = lc + 1, mid = (st + en) / 2; insert(t, i, vl, lc, st, mid); insert(t, i, vl, rc, mid, en); } int get(int t, int l, int r, int cur = 1, int st = 1, int en = N){ if (l >= en or r <= st) return inf; if (l <= st and r >= en) return Mn[t][cur]; int lc = cur + cur, rc = lc + 1, mid = (st + en) / 2; return min(get(t, l, r, lc, st, mid), get(t, l, r, rc, mid, en)); } signed main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); for (int i=1;i<(N<<1);i++) Mn[0][i] = Mn[1][i] = inf; int m, n; cin>>m>>n; for (int i=1;i<=m;i++){ cin>>a[i]>>b[i]>>c[i]>>d[i]; mp[a[i]] = mp[b[i]] = mp[c[i]] = 1; } if (mp[1] == 0 or mp[n] == 0) return cout<<-1<<'\n', 0; for (auto [i, j] : mp) mp2[i] = ++cur; insert(0, 1, 0); for (int i=1;i<=m;i++){ a[i] = mp2[a[i]]; b[i] = mp2[b[i]]; c[i] = mp2[c[i]]; Mem[i] = get(0, a[i], cur + 1) + d[i]; insert(0, c[i], Mem[i]); } for (int i=m;i>=1;i--){ Mem[i] = min(Mem[i], get(1, c[i], cur + 1) + d[i]); insert(1, b[i], Mem[i]); } int Ans = get(1, cur, cur + 1); if (Ans == inf) Ans = -1; cout<<Ans<<'\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...