Submission #1222364

#TimeUsernameProblemLanguageResultExecution timeMemory
1222364noyancanturkSki 2 (JOI24_ski2)C++20
86 / 100
344 ms1940 KiB
#include<bits/stdc++.h>
using namespace std;

#define int int64_t
#define pb push_back

using pii=pair<int,int>;

const int lim=310;

#define no INT_MIN

int sum(int i,int j){
  if(i==no||j==no)return no;
  return i+j;
}

int mul(int i,int j){
  if(i==no||j==no)return no;
  return i*j;
}

int mn(int i,int j){
  if(i==no)return j;
  if(j==no)return i;
  return min(i,j);
}

vector<int>guys[2*lim];
int dp[2][lim][lim];

signed main(){
  int n,K;
  cin>>n>>K;
  int a[n],b[n];
  for(int i=0;i<n;i++){
    cin>>a[i]>>b[i];
    guys[a[i]].pb(b[i]);
  }
  int x=0;
  for(int i=0;i<lim;i++){
    for(int j=0;j<lim;j++){
      dp[x][i][j]=no;
    }
  }
  dp[0][0][0]=0;
  int seen=no;
  int fr=1;
  for(int i=0;i<2*lim;i++){
    if(fr&&!guys[i].size())continue;
    x=!x;
    for(int j=0;j<lim;j++){
      for(int k=0;k<lim;k++){
        dp[x][j][k]=no;
      }
    }
    if(fr){
      dp[x][guys[i].size()-1][1]=0;
      fr=0;
    }else{
      for(int j=0;j<lim;j++){
        for(int k=0;k<lim;k++){
          dp[!x][j][k]=sum(dp[!x][j][k],j*K);
        }
      }
      for(int j=0;j<lim;j++){
        for(int k=0;k<lim;k++){
          int up=j+guys[i].size(),bel=k;
          int kk=min(up,bel);
          up-=kk,bel-=kk;
          if(up<lim&&bel+kk<lim){
            dp[x][up][bel+kk]=mn(dp[x][up][bel+kk],dp[!x][j][k]);
          }
        }
      }
      for(int j=lim-2;0<=j;j--){
        for(int k=1;k<lim;k++){
          dp[x][j][k]=mn(dp[x][j][k],sum(dp[x][j+1][k-1],seen));
        }
      }
      for(int j=0;j<lim;j++){
        for(int k=lim-1;0<=k;k--){
          if(j)dp[x][j][k]=mn(dp[x][j][k],dp[x][j-1][k]);
          if(k+1<lim)dp[x][j][k]=mn(dp[x][j][k],dp[x][j][k+1]);
        }
      }
    }
    for(int j:guys[i]){
      seen=mn(seen,j);
    }
    // for(int j=0;j<lim;j++){
    //   for(int k=0;k<lim;k++){
    //     cerr<<dp[x][j][k]<<' ';
    //   }cerr<<'\n';
    // }cerr<<'\n';
  }
  cout<<dp[x][0][0]<<'\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...