제출 #1222364

#제출 시각아이디문제언어결과실행 시간메모리
1222364noyancanturkSki 2 (JOI24_ski2)C++20
86 / 100
344 ms1940 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(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 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...