제출 #1271607

#제출 시각아이디문제언어결과실행 시간메모리
1271607lechaaPinball (JOI14_pinball)C++20
11 / 100
1 ms328 KiB
#include <bits/stdc++.h> using namespace std; #define int long long vector<int> d; int idx(int k){ auto it = lower_bound(d.begin(), d.end(), k); return (it - d.begin()); } vector<int> t; void update(int i, int l, int r, int i1, int v){ if(l == r){ t[i] = v; return; } int mid = (l+r)/2; if(i1 <= mid){ update(i*2, l, mid, i1, v); }else{ update(i*2+1, mid+1, r, i1, v); } t[i] = min(t[i*2], t[i*2+1]); } int query(int i, int l, int r, int l1, int r1){ if(l > r1 || l1 > r){ return 2e18; } if(l1 <= l && r1 >= r){ return t[i]; } int mid = (l + r)/2; return min(query(i*2, l, mid, l1, r1), query(i*2+1, mid+1, r, l1, r1)); } vector<int> t1; void update1(int i, int l, int r, int i1, int v){ if(l == r){ t1[i] = v; return; } int mid = (l+r)/2; if(i1 <= mid){ update1(i*2, l, mid, i1, v); }else{ update1(i*2+1, mid+1, r, i1, v); } t1[i] = min(t1[i*2], t1[i*2+1]); } int query1(int i, int l, int r, int l1, int r1){ if(l > r1 || l1 > r){ return 2e18; } if(l1 <= l && r1 >= r){ return t1[i]; } int mid = (l + r)/2; return min(query1(i*2, l, mid, l1, r1), query1(i*2+1, mid+1, r, l1, r1)); } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); int m, n; cin >> m >> n; vector<array<int, 4>> x(m); for(int i = 0; i < m; i++){ cin >> x[i][0] >> x[i][1] >> x[i][2] >> x[i][3]; d.push_back(x[i][0]); d.push_back(x[i][1]); d.push_back(x[i][2]); } d.push_back(1); d.push_back(n); sort(d.begin(), d.end()); d.erase(unique(d.begin(), d.end()), d.end()); t.resize(d.size()*4, 2e18); t1.resize(d.size()*4, 2e18); vector<int> dp(d.size(), 2e18); update(1, 0, d.size()-1, 0, 0); t1.resize(d.size()*4, 2e18); vector<int> dp1(d.size(), 2e18); update1(1, 0, d.size()-1, d.size()-1, 0); int mn = 2e18; for(int i = 0; i < m; i++){ int l, r; l = idx(x[i][0]); r = idx(x[i][1]); int c = idx(x[i][2]); int j = query(1, 0, d.size()-1, l, r); int raveluk = -1; if(j != 2e18){ dp[c] = min(dp[c], j + x[i][3]); update(1, 0, d.size()-1, c, dp[c]); raveluk = j; } j = query1(1, 0, d.size()-1, l, r); if(j == 2e18) continue; dp1[c] = min(dp1[c], j + x[i][3]); update1(1, 0, d.size()-1, c, dp1[c]); int h = j + x[i][3]; if(raveluk == -1) continue; mn = min(mn, raveluk + h); } if(mn == 2e18){ mn = -1; } cout << mn << "\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...