이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <set>
#include <map>
#include <climits>
#define int long long
using namespace std;
const int M = 205, K = 605, INF = 1e15;
int intl[M], intr[M], to[M], cost[M], dp[M][K][K], m, n, k;
int calc(int i, int l, int r) {
if (l == 0 && r == k - 1) return 0LL;
if (i == -1) return INF;
int &dpr = dp[i][l][r];
if (dpr == -1) {
dpr = calc(i - 1, l, r);
if (l <= to[i] && to[i] <= r && !(l <= intl[i] && intr[i] <= r)) {
// cerr << "the interval [" << l << "-" << r << "] catches " << i << ": " << intl[i] << '-' << intr[i] << " to " << to[i] << endl;
dpr = min(dpr, cost[i] + calc(i - 1, min(intl[i], l), max(intr[i], r)));
}
// fprintf(stderr, "dp[%lld][%lld][%lld] = %lld\n", i, l, r, dpr);
}
return dpr;
}
signed main() {
#ifdef ONLINE_JUDGE
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
#endif
cin >> m >> n;
set <int> compress;
for (int i = 0; i < m; i++) {
cin >> intl[i] >> intr[i] >> to[i] >> cost[i];
compress.insert(intl[i]);
compress.insert(intr[i]);
compress.insert(to[i]);
}
if (*compress.begin() > 1 || *compress.rbegin() < n) {
cout << -1;
return 0;
}
map <int, int> compressidx;
for (auto &x : compress) {
compressidx[x] = k++;
}
for (int _1 = 0; _1 <= m; _1++) {
for (int _2 = 0; _2 <= k; _2++) {
for (int _3 = 0; _3 <= k; _3++) {
dp[_1][_2][_3] = -1;
}
}
}
for (int i = 0; i < m; i++) {
intl[i] = compressidx[intl[i]];
intr[i] = compressidx[intr[i]];
to[i] = compressidx[to[i]];
}
int mn = LLONG_MAX;
for (int i = 0; i < k; i++) {
if (mn > calc(m - 1, i, i)) mn = calc(m - 1, i, i);
}
if (mn >= INF) mn = -1;
cout << mn;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |