제출 #1197684

#제출 시각아이디문제언어결과실행 시간메모리
1197684abczzSki 2 (JOI24_ski2)C++20
100 / 100
481 ms852932 KiB
#include <iostream>
#include <map>
#define ll long long

using namespace std;

ll n, k, H[300], C[300], tot[601], A[601], B[601];
ll dp[601][301][301], dp2[601][301][301];
map <ll, ll> mp;
int main() {
  cin >> n >> k;
  for (int i=0; i<n; ++i) {
    cin >> H[i] >> C[i];
    ++mp[H[i]];
    ++mp[H[i]+1];
  }
  ll z = 0;
  for (auto [x, y] : mp) {
    B[z] = x;
    mp[x] = z++;
  }
  for (int i=0; i<mp.size(); ++i) A[i] = 1e18;
  for (int i=0; i<n; ++i) {
    ++tot[mp[H[i]]];
    A[mp[H[i]]] = min(A[mp[H[i]]], C[i]);
  }
  for (int i=0; i<=mp.size(); ++i) {
    for (int j=0; j<=n; ++j) {
      for (int x=0; x<=n; ++x) {
        dp[i][j][x] = dp2[i][j][x] = 1e18;
      }
    }
  }
  B[mp.size()] = 1e10;
  dp[0][tot[0]][1] = 0;
  for (int i=0; i<mp.size(); ++i) {
    if (i) A[i] = min(A[i], A[i-1]);
    for (ll j=0; j<=n; ++j) {
      for (ll x=1; x<=n; ++x) {
        dp2[i][j][x] = min(dp2[i][j][x], dp2[i][j][x-1]);
        if (i) dp[i][j][x] = min(dp[i][j][x], dp2[i][j][x] + x * A[i-1]);
        if (dp[i][j][x] >= 1e18) continue;
        ll d = min(B[i+1]-B[i], (j+x-1)/x), s;
        if (j-d*x >= 0) s = (j-x+j-d*x)*d/2 * k;
        else s = (j-x+j-(d-1)*x)*(d-1)/2 * k;
        dp2[i+1][max(0LL, j-d*x)+tot[i+1]][x] = min(dp2[i+1][max(0LL, j-d*x)+tot[i+1]][x], dp[i][j][x] + s - A[i] * x);
      }
    }
  }
  ll f = 1e18;
  for (int x=1; x<=n; ++x) {
    dp2[mp.size()][0][x] = min(dp2[mp.size()][0][x], dp2[mp.size()][0][x-1]);
    dp[mp.size()][0][x] = min(dp[mp.size()][0][x], dp2[mp.size()][0][x] + x * A[mp.size()-1]);
    f = min(f, dp[mp.size()][0][x]);
  }
  cout << f << '\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...