Submission #53015

#TimeUsernameProblemLanguageResultExecution timeMemory
53015someone_aaPopeala (CEOI16_popeala)C++17
100 / 100
838 ms22476 KiB
#include <bits/stdc++.h> #define pii pair<int,int> #define mp make_pair using namespace std; const int maxt = 21100; const int maxn = 55; int dp[maxn][maxt]; int n, t, s; int pref[maxt], arr[maxt]; int prefans[maxn][maxt]; int maxans[maxt]; int prefmin[maxn][maxt]; pair<int, int> intervals[55][maxt]; int f(int i, int j) { int cnt = 0; for(int k=1;k<=n;k++) { if(prefans[k][j] - prefans[k][i-1] == (j-i+1)) cnt++; } return cnt; } int main() { ios_base::sync_with_stdio(false); cin>>n>>t>>s; for(int i=1;i<=t;i++) { cin>>arr[i]; pref[i] = pref[i-1] + arr[i]; } char answ; for(int i=1;i<=n;i++) { for(int j=1;j<=t;j++) { cin>>answ; prefans[i][j] = prefans[i][j-1]; if(answ == '1') { prefans[i][j]++; maxans[j]++; } } } for(int i=0;i<=n;i++) { int li=1, ri=1; for(int j=1;j<=t;j++) { while(ri < j && f(ri+1, j) <= i) ri++; if(i == 0) intervals[i][j] = make_pair(1, ri); else intervals[i][j] = make_pair(li+1, ri); } } memset(dp, -1, sizeof(dp)); dp[0][0] = 0; for(int i=1;i<=t;i++) { dp[1][i] = pref[i] * f(1, i); } for(int i=2;i<=s;i++) { memset(prefmin, -1, sizeof(prefmin)); for(int j=0;j<=n;j++) { int minm = INT_MAX; for(int tt=1;tt<=t;tt++) { if(dp[i-1][tt-1] == -1) continue; minm = min(minm, dp[i-1][tt-1] - j * pref[tt-1]); prefmin[j][tt] = minm; } } for(int j=1;j<=t;j++) { if(i > j) continue; dp[i][j] = INT_MAX; for(int x=0;x<=maxans[j];x++) { if(prefmin[x][intervals[x][j].second] != -1) { dp[i][j] = min(dp[i][j], prefmin[x][intervals[x][j].second] + pref[j] * x); } } } } for(int i=1;i<=s;i++) { cout<<dp[i][t]<<"\n"; } 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...