Submission #1241652

#TimeUsernameProblemLanguageResultExecution timeMemory
1241652lambd47Ski 2 (JOI24_ski2)C++20
0 / 100
146 ms213908 KiB
#include <bits/stdc++.h>

#define int long long
using namespace std;

#define sz(v) ((int)(v).size())
#define all(v) (v).begin(), (v).end()
#define L(i, j, k) for(int i = (j); i <= (k); ++i)
#define R(i, j, k) for(int i = (j); i >= (k); --i)

std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count());

const int MOD=1e18;
const int MX=301;
void solve() {
    int dp[MX][MX][MX];//guarda aonde eu to,ultima base de subir que peguei e quantos ta no bolso
    int n,m;cin>>n>>m;
    L(i,0,n){
        L(j,0,n){
            L(k,0,n){
                dp[i][j][k]=MOD;
            }
        }
    }
    vector<int> h(n);
    vector<int> c(n);
    vector<int> ord(n);iota(all(ord),0);
    L(i,0,n-1){
        cin>>h[i]>>c[i];
    }
    sort(all(ord),[&](int a, int b){
            if(h[a]==h[b])return c[a]>c[b];
            return h[a]<h[b];
    });
    vector<int> aux(n);
    L(i,0,n-1)aux[i]=h[ord[i]];
    h=aux;
    L(i,0,n-1)aux[i]=c[ord[i]];
    c=aux;

    vector<bool> pode(n,0);
    pode[n-1]=1;
    L(i,0,n-2){
        if(h[i]!=h[i+1])pode[i]=1;//pode virar uma base de subida
    }
    dp[n][n][0]=0;
    int resp=MOD;
    R(i,n-1,0){
        L(j,i+1,n){//ultima base
            L(k,0,n-1-i){
                dp[i][j][k+1]=min(dp[i][j][k+1],dp[i+1][j][k]);//so boto pra esperar
                if(pode[i]){
                    dp[i][j][1]=min(dp[i][j][1],dp[i+1][j][k]+k*c[i]);//esvazio os acumulados pro meu atual
                }
                if(pode[i])dp[i][i][k+1]=min(dp[i][i][k+1],dp[i+1][j][k]);//transformo em base de subida
                if(pode[i]){//posso esvaziar na base de subida tbm
                    dp[i][i][1]=min(dp[i][i][1],dp[i+1][j][k] +k*c[i]);
                }
                if(j!=n)dp[i][j][k]=min(dp[i][j][k],dp[i+1][j][k]+(h[j]-h[i]+1)*m + c[j]);//levo pra base de subida
            }
        }
    }//resp eh min dp[0][j][0]-c[j];

    int somat=0;
    L(i,0,n-1){
        L(j,i,n-1){
            resp=min(resp,-c[i]+dp[i][j][1]+(h[j]*i-somat+i)*m + c[j]*i);
        }
        somat+=h[i];
    }
    cout<<resp;




}
 
int32_t main() {
    std::cin.tie(0)->sync_with_stdio(0); 
    std::cin.exceptions(std::cin.failbit);

    int T = 1;
//    std::cin >> T;
    while(T--) {
        solve();
    }

	return 0;
}


#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...