Submission #1222426

#TimeUsernameProblemLanguageResultExecution timeMemory
1222426noyancanturkSki 2 (JOI24_ski2)C++20
86 / 100
1350 ms2096 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(1e14<i||1e14<j)return no;
  if(i==no||j==no)return no;
  return i+j;
}

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

int mn(int i,int j){
  if(1e14<i&&1e14<j)return no;
  if(i==no||1e14<i)return j;
  if(j==no||1e14<j)return i;
  return min(i,j);
}

map<int,vector<int>>guys;
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]);
  }
  for(int i=0;i<n;i++){
    if(!guys.count(a[i]+1))guys[a[i]+1]=vector<int>();
    if(!guys.count(a[i]+2))guys[a[i]+2]=vector<int>();
    if(!guys.count(a[i]+3))guys[a[i]+3]=vector<int>();
  }
  map<int,int>nxt;
  int ppp=-1;
  for(auto&[x,y]:guys){
    nxt[ppp]=x;
    ppp=x;
  }
  nxt[ppp]=INT_MAX;
  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;
  ppp=-1;
  for(auto&[i,ar]:guys){
    if(fr&&!ar.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){
      // cerr<<ar.size()-1<<" aaaaaa\n";
      dp[x][ar.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*(i-ppp));
        }
      }
      for(int j=0;j<lim;j++){
        for(int k=0;k<lim;k++){
          int up=j+ar.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=0;k<lim;k++){
      //     cerr<<dp[x][j][k]<<' ';
      //   }cerr<<'\n';
      // }cerr<<'\n';
      int iwant=nxt[i]-i-1;
      //cerr<<iwant<<'\n';
      if(iwant){
        x=!x;
        for(int j=0;j<lim;j++){
          for(int k=0;k<lim;k++){
            dp[x][j][k]=dp[!x][j][k];
          }
        }
        for(int j=lim-1;0<=j;j--){
          for(int k=0;k<lim;k++){
            if(j<iwant*k){
              int take=j/k;
              dp[x][0][k]=mn(dp[x][0][k],
                sum(dp[!x][j][k],K*( k*take*(take+1)/2 + (take+1)*(j-take*k))));
            }else{
              dp[x][j-iwant*k][k]=mn(dp[x][j-iwant*k][k],sum(dp[!x][j][k],k*K*iwant*(iwant+1)/2));  
            }
          }
        }
      }
      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:ar){
      seen=mn(seen,j);
    }
    ppp=i;
    // 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...