제출 #985563

#제출 시각아이디문제언어결과실행 시간메모리
985563maomao90Ski 2 (JOI24_ski2)C++17
0 / 100
2092 ms220224 KiB
// Hallelujah, praise the one who set me free // Hallelujah, death has lost its grip on me // You have broken every chain, There's salvation in your name // Jesus Christ, my living hope #include <bits/stdc++.h> using namespace std; #define REP(i, s, e) for (int i = (s); i < (e); i++) #define RREP(i, s, e) for (int i = (s); i >= (e); i--) template <class T> inline bool mnto(T& a, T b) {return a > b ? a = b, 1 : 0;} template <class T> inline bool mxto(T& a, T b) {return a < b ? a = b, 1: 0;} typedef unsigned long long ull; typedef long long ll; typedef long double ld; #define FI first #define SE second typedef pair<int, int> ii; typedef pair<ll, ll> pll; typedef tuple<int, int, int> iii; #define ALL(_a) _a.begin(), _a.end() #define SZ(_a) (int) _a.size() #define pb push_back typedef vector<int> vi; typedef vector<ll> vll; typedef vector<ii> vii; typedef vector<iii> viii; #ifndef DEBUG #define cerr if (0) cerr #endif const int INF = 1000000005; const ll LINF = 1000000000000000005ll; const int MAXN = 305; int n, m; ii hc[MAXN]; int lst[MAXN], mnc[MAXN]; map<int, vi> mp; map<int, int> id; vi vh; ll dp[MAXN][MAXN][MAXN]; ll solve() { mp.clear(); id.clear(); vh.clear(); REP (i, 1, n + 1) { mp[hc[i].FI].pb(hc[i].SE); } sort(hc + 1, hc + n + 1); RREP (i, n, 1) { if (hc[i + 1].FI == hc[i].FI) { lst[i] = lst[i + 1]; } else { lst[i] = i; } } mnc[0] = INF; REP (i, 1, n + 1) { mnc[i] = min(mnc[i - 1], hc[i].SE); } REP (i, 1, n + 1) { cerr << hc[i].FI << ' ' << hc[i].SE << ' ' << mnc[i] << '\n'; } int rht = 0; for (auto [h, v] : mp) { mxto(rht, h); rht += SZ(v); for (int i = h; i < rht; i++) { vh.pb(i); } } vh.pb(-1); sort(ALL(vh)); vh.erase(unique(ALL(vh)), vh.end()); REP (i, 1, SZ(vh)) { id[vh[i]] = i; } REP (i, 0, n + 1) { REP (j, 0, n + 1) { REP (k, 0, SZ(vh)) { dp[i][j][k] = LINF; } } } dp[1][1][1] = 0; REP (i, 1, n + 1) { REP (j, 1, i + 1) { REP (k, 1, SZ(vh)) { if (dp[i][j][k] == LINF) { continue; } cerr << i << ' ' << j << ' ' << vh[k] << ": " << dp[i][j][k] << '\n'; int nk = max(k + 1, id[hc[i + 1].FI]); ll w = 0; REP (l, 1, j + 1) { if (i + l > n || vh[nk] < hc[i + l].FI) { continue; } w += (ll) (vh[nk] - hc[i + l].FI) * m; mnto(dp[i + l][j][nk], dp[i][j][k] + w); } /* int ni = min(i + j, lst[i + 1]), nk = max(k + 1, id[hc[i + 1].FI]); mnto(dp[i + j][j][nk], dp[i][j][k] + (ni - i) * (vh[nk] - hc[i + 1].FI) * m); */ if (i > 1) { mnto(dp[i + 1][j + 1][k], dp[i][j][k] + mnc[i - j] + (ll) max(0, vh[k] - hc[i + 1].FI) * m); } } } } ll ans = LINF; REP (j, 1, n + 1) { REP (k, 1, SZ(vh)) { mnto(ans, dp[n][j][k]); } } return ans; } int main() { #ifndef DEBUG ios::sync_with_stdio(0), cin.tie(0); #endif cin >> n >> m; REP (i, 1, n + 1) { cin >> hc[i].FI >> hc[i].SE; } sort(hc + 1, hc + n + 1); lst[n + 1] = n + 1; hc[n + 1].FI = INF; ll ans = LINF; ll res = 0; REP (i, 1, n + 1) { REP (j, 1, i) { res += (ll) (hc[i].FI - hc[j].FI) * m; hc[j].FI = hc[i].FI; } mnto(ans, res + solve()); } cout << ans << '\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...