Submission #508729

# Submission time Handle Problem Language Result Execution time Memory
508729 2022-01-13T16:35:47 Z Jeff12345121 Pinball (JOI14_pinball) C++14
0 / 100
1 ms 1740 KB
#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;
const int nmax = 505, inf = (1LL << 60);
int n, m, dp[nmax][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);
    for (int i = 1; i <= n; i++) {
        int l, r, hole, cost;
        in >> l >> r >> hole >> cost;
        devices[i] = {l, r, hole, cost};

        positions.insert(l);
        positions.insert(r);
        positions.insert(hole);
    }

    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 time Memory Grader output
1 Correct 1 ms 460 KB Output is correct
2 Correct 0 ms 844 KB Output is correct
3 Correct 1 ms 1356 KB Output is correct
4 Correct 1 ms 1484 KB Output is correct
5 Correct 1 ms 1612 KB Output is correct
6 Correct 1 ms 716 KB Output is correct
7 Incorrect 1 ms 1740 KB Output isn't correct
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 460 KB Output is correct
2 Correct 0 ms 844 KB Output is correct
3 Correct 1 ms 1356 KB Output is correct
4 Correct 1 ms 1484 KB Output is correct
5 Correct 1 ms 1612 KB Output is correct
6 Correct 1 ms 716 KB Output is correct
7 Incorrect 1 ms 1740 KB Output isn't correct
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 460 KB Output is correct
2 Correct 0 ms 844 KB Output is correct
3 Correct 1 ms 1356 KB Output is correct
4 Correct 1 ms 1484 KB Output is correct
5 Correct 1 ms 1612 KB Output is correct
6 Correct 1 ms 716 KB Output is correct
7 Incorrect 1 ms 1740 KB Output isn't correct
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 460 KB Output is correct
2 Correct 0 ms 844 KB Output is correct
3 Correct 1 ms 1356 KB Output is correct
4 Correct 1 ms 1484 KB Output is correct
5 Correct 1 ms 1612 KB Output is correct
6 Correct 1 ms 716 KB Output is correct
7 Incorrect 1 ms 1740 KB Output isn't correct
8 Halted 0 ms 0 KB -