#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=min(seen/K,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 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... |