Submission #1317161

#TimeUsernameProblemLanguageResultExecution timeMemory
1317161opeleklanosCarnival Tickets (IOI20_tickets)C++20
14 / 100
2399 ms159748 KiB
#include <iostream> #include <algorithm> #include <map> #include <vector> #include <queue> #include <set> #include "tickets.h" using namespace std; #define ll long long vector<vector<ll>> x; vector<vector<pair<ll, ll>>> dp; ll n, m; pair<ll, ll> makeDp(ll indx, ll used_high){ if(used_high > indx+1) return{-1, -1}; if(dp[indx][used_high].first != -1) return dp[indx][used_high]; if(indx == 0){ if(used_high == 1) return dp[indx][used_high] = {x[indx][m-1], m-1}; if(used_high == 0) return dp[indx][used_high] = {-x[indx][0], 0}; } dp[indx][used_high] = {makeDp(indx-1, used_high).first - (ll)x[indx][0], 0}; if(used_high && dp[indx][used_high].first < makeDp(indx-1, used_high-1).first + (ll)x[indx][m-1]){ dp[indx][used_high] = {makeDp(indx-1, used_high-1).first + (ll)x[indx][m-1], m-1}; } return dp[indx][used_high]; } ll find_maximum(int k, vector<vector<int>> x1){ n = x1.size(); m = x1[0].size(); x.assign(n, vector<ll>(m, 0)); vector<vector<int>> arr(n, vector<int>(m, -1)); ll ans = 0; for(int i = 0; i<n; i++) for(int j = 0; j<m; j++) x[i][j] = (ll)x1[i][j]; if(m == 1){ sort(x.begin(), x.end()); for(ll i = 0; i<n/2; i++) ans -= (ll)x[i][0]; for(ll i = n/2; i<n; i++) ans += (ll)x[i][0]; return ans; } else if(k == 1){ dp.assign(n, vector<pair<ll, ll>>(n, pair<ll, ll>(-1, -1))); ans = makeDp(n-1, n/2).first; ll uh = n/2; for(ll i = n-1; i>=0; i--){ arr[i][dp[i][uh].second] = 0; if(dp[i][uh].second == m-1) uh--; } return ans; } else if(k == m){ vector<int> allValues; for(int i = 0; i<n; i++) for(int j = 0; j<m; j++) allValues.push_back(x[i][j]); sort(allValues.begin(), allValues.end()); map<int, int> smallV; for(int i = 0; i<(n*m)/2; i++) smallV[allValues[i]] ++; for(int i = 0; i<n; i++) for(int j = 0; j<m; j++) { if(smallV[x[i][j]]){ smallV[x[i][j]]--; ans -= (ll)x[i][j]; x[i][j] = 0; } else{ ans += (ll)x[i][j]; x[i][j] = 1; } } priority_queue<pair<int, int>> pq; vector<int> takenZ(n, 0); for(int i = 0; i<n; i++){ pair<int, int> p = {0, i}; for(int j = 0; j<m; j++) p.first += x[i][j]; pq.push(p); } for(int i = 0; i<k; i++){ vector<pair<int, int>> add; int j = 0; while(j<n/2){ add.push_back(pq.top()); add[j].first --; arr[pq.top().second][m - pq.top().first] = i; j++; pq.pop(); } while(!pq.empty()){ arr[pq.top().second][takenZ[pq.top().second]] = i; takenZ[pq.top().second] ++; add.push_back(pq.top()); pq.pop(); } for(int i = 0; i<add.size(); i++) pq.push(add[i]); } // allocate_tickets(arr); } else{ priority_queue<pair<int, int>> pq; vector<int> takenZ(n, 0); for(int i = 0; i<n; i++){ pair<int, int> p = {0, i}; for(int j = 0; j<m; j++) p.first += x[i][j]; pq.push(p); } for(int i = 0; i<k; i++){ vector<pair<int, int>> add; int j = 0; while((j<n/2 || pq.top().first == m-i) && pq.top().first != 0){ add.push_back(pq.top()); add[j].first --; arr[pq.top().second][m - pq.top().first] = i; j++; pq.pop(); } while(!pq.empty()){ arr[pq.top().second][takenZ[pq.top().second]] = i; takenZ[pq.top().second] ++; add.push_back(pq.top()); pq.pop(); } for(int i = 0; i<add.size(); i++) pq.push(add[i]); ans += (ll)min((ll)j, (ll)n-j); } } allocate_tickets(arr); return ans; } // int main(void){ // freopen("input.txt", "r", stdin); // int n1, m1, k1; // cin>>n1>>m1>>k1; // vector<vector<int>> t; // t.assign(n1, vector<int>(m1, 0)); // for(int i = 0; i<n1; i++) for(int j = 0; j<m1; j++) cin>>t[i][j]; // cout<<find_maximum(k1, t); // }
#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...