Submission #508731

#TimeUsernameProblemLanguageResultExecution timeMemory
508731Jeff12345121Pinball (JOI14_pinball)C++14
11 / 100
281 ms404008 KiB
#include <bits/stdc++.h> #define in cin #define out cout #define int long long using namespace std; //ifstream in("in.in"); //ofstream out("out.out"); struct device { int l, r, hole, cost; }; vector<device> devices,sortDevices; const int nmax = 505, inf = (1LL << 60); int n, m, dp[205][nmax][nmax]; void minSelf(int &a, int b) { if (b < a) { a = b; } } set<int> positions; unordered_map<int, int> realToNorm, normToReal; int32_t main() { in >> n >> m; if (m == 1) { out << "0\n"; return 0; } devices.resize(n + 1); sortDevices.resize(n + 1); for (int i = 1; i <= n; i++) { int l, r, hole, cost; in >> l >> r >> hole >> cost; devices[i] = {l, r, hole, cost}; sortDevices[i] = {l, r, hole, cost}; positions.insert(l); positions.insert(r); positions.insert(hole); } sort(sortDevices.begin() + 1, sortDevices.end(), [&](device x, device y) { return x.l < y.l; }); int r = 1; for (int i = 1; i <= n; i++) { if (sortDevices[i].l > r) { out << "-1\n"; return 0; } r = max(r, sortDevices[i].r); } int nr = 0; for (auto k : positions) { nr++; realToNorm[k] = nr; normToReal[nr] = k; } for (int i = 1; i <= n; i++) { devices[i].l = realToNorm[devices[i].l]; devices[i].r = realToNorm[devices[i].r]; devices[i].hole = realToNorm[devices[i].hole]; } m = nr; /// dp[i][l][r] = using only devices i...n, we have extended the road for the interval /// l - r. sum will be in dp[1][1..m] for (int i = 0; i <= n + 1; i++) { for (int l = 0; l <= m; l++) { for (int r = 0; r <= m; r++) { dp[i][l][r] = inf; } } } for (int i = m; i >= 1; i--) { dp[n + 1][i][i] = 0; } for (int i = n; i >= 1; i--) { for (int l = 1; l <= m; l++) { for (int r = l; r <= m; r++) { minSelf(dp[i][l][r], dp[i + 1][l][r]); if (dp[i + 1][l][r] == inf) continue; if (l <= devices[i].hole && devices[i].hole <= r) { int newL = min(l, devices[i].l); int newR = max(r, devices[i].r); minSelf(dp[i][newL][newR], dp[i + 1][l][r] + devices[i].cost); minSelf(dp[i][l][r], dp[i + 1][l][r]); } } } } if (dp[1][1][m] == inf) { out << "-1\n"; } else { out << dp[1][1][m] << "\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...