#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |