Submission #1222382

#TimeUsernameProblemLanguageResultExecution timeMemory
1222382noyancanturkSki 2 (JOI24_ski2)C++20
0 / 100
1 ms328 KiB
#include<bits/stdc++.h>
using namespace std;

#define int int64_t
#define pb push_back

using pii=pair<int,int>;

const int lim=7;

#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);
}

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>();
  }
  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){
      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));
        }
      }
      int iwant=min(seen/K,nxt[i]-i-1);
      for(int j=lim-1;0<=j;j--){
        for(int k=0;k<lim;k++){
          int take=min(iwant,j);
          if(take&&0<=j-take){
            dp[x][j-take][k]=mn(dp[x][j-take][k],sum(dp[x][j][k],K*take*(take+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...