Submission #1090004

#TimeUsernameProblemLanguageResultExecution timeMemory
1090004onlk97Carnival Tickets (IOI20_tickets)C++14
55 / 100
599 ms114736 KiB
#include "tickets.h" #include <vector> #include <bits/stdc++.h> using namespace std; long long find_maximum(int k,vector <vector <int> > x){ int n=x.size(),m=x[0].size(); vector <vector <int> > op(n,vector <int>(m,-1)); int chkmx=0; for (int i=0; i<n; i++) for (int j=0; j<m; j++) chkmx=max(chkmx,x[i][j]); long long ans=0; if (k==1){ int idxmn[n],idxmx[n]; for (int i=0; i<n; i++){ idxmn[i]=min_element(x[i].begin(),x[i].end())-x[i].begin(); idxmx[i]=max_element(x[i].begin(),x[i].end())-x[i].begin(); } long long dp[n+1][n+1],bac[n+1][n+1]; for (int i=0; i<=n; i++){ for (int j=0; j<=n; j++) dp[i][j]=-1e18; } dp[0][0]=0; for (int i=0; i<n; i++){ for (int j=0; j<=n/2; j++){ if (dp[i][j]-x[i][idxmn[i]]>=dp[i+1][j]){ dp[i+1][j]=dp[i][j]-x[i][idxmn[i]]; bac[i+1][j]=0; } if (dp[i][j]+x[i][idxmx[i]]>=dp[i+1][j+1]){ dp[i+1][j+1]=dp[i][j]+x[i][idxmx[i]]; bac[i+1][j+1]=1; } } } ans=dp[n][n/2]; int cur=n/2; for (int i=n; i>0; i--){ if (bac[i][cur]){ op[i-1][idxmx[i-1]]=0; cur--; } else { op[i-1][idxmn[i-1]]=0; } } } else if (chkmx<=1){ int bal[n]; for (int i=0; i<n; i++){ bal[i]=0; for (int j=0; j<m; j++){ if (!x[i][j]) bal[i]--; else bal[i]++; } } int fr[n],ba[n]; for (int i=0; i<n; i++) fr[i]=0; for (int i=0; i<n; i++) ba[i]=m-1; for (int i=0; i<k; i++){ vector <pair <int,int> > v; for (int j=0; j<n; j++) v.push_back({bal[j],j}); sort(v.begin(),v.end()); for (int j=0; j<n; j++){ if (j<n/2){ op[v[j].second][fr[v[j].second]]=i; if (!x[v[j].second][fr[v[j].second]]) bal[v[j].second]++; else bal[v[j].second]--; ans-=x[v[j].second][fr[v[j].second]]; fr[v[j].second]++; } else { op[v[j].second][ba[v[j].second]]=i; if (x[v[j].second][ba[v[j].second]]) bal[v[j].second]--; else bal[v[j].second]++; ans+=x[v[j].second][ba[v[j].second]]; ba[v[j].second]--; } } } } else if (k==m){ vector <pair <long long,pair <int,int> > > v; for (int i=0; i<n; i++) for (int j=0; j<m; j++) v.push_back({x[i][j],{i,j}}); sort(v.begin(),v.end()); for (int i=0; i<n*m; i++){ if (i<n*m/2) ans-=v[i].first; else ans+=v[i].first; } bool is[n][m]; for (int i=0; i<n; i++) for (int j=0; j<m; j++) is[i][j]=0; for (int i=n*m/2; i<n*m; i++) is[v[i].second.first][v[i].second.second]=1; int idx=0; for (int i=0; i<n; i++){ for (int j=0; j<m; j++){ if (is[i][j]){ op[i][j]=idx; idx++; if (idx>=m) idx-=m; } } } bool hv[m]; for (int i=0; i<n; i++){ for (int j=0; j<m; j++) hv[j]=0; for (int j=0; j<m; j++) if (op[i][j]>=0) hv[op[i][j]]=1; int ptr=0; for (int j=0; j<m; j++){ if (op[i][j]==-1){ while (hv[ptr]) ptr++; op[i][j]=ptr; ptr++; } } } } allocate_tickets(op); return ans; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...