Submission #364051

#TimeUsernameProblemLanguageResultExecution timeMemory
364051wind_reaperCarnival Tickets (IOI20_tickets)C++17
16 / 100
676 ms51448 KiB
#include "tickets.h" #include <bits/stdc++.h> using namespace std; long long find_maximum(int k, vector<vector<int>> x) { int n = x.size(); int m = x[0].size(); vector<vector<int>> ans(n, vector<int>(m, -1)); long long a = 0; for(int i = 0; i < n; i++){ for(int j = m-1; j >= m-k; --j){ ans[i][j] = (m-1-j); a += 1LL*x[i][j]; } } vector<array<int, 4>> b; for(int i = 0; i < n; i++){ for(int j = 0; j < min(k, m/2); j++) for(int w = m-1; w >= max(m-k, (m+1)/2); --w) b.push_back({x[i][j] + x[i][w], i, j, w}); } sort(b.begin(), b.end()); int exchanges = 0; for(auto& [red, row, mn, mx] : b){ if(exchanges == (n*k)/2) break; if(ans[row][mx] == -1 || ans[row][mn] != -1) continue; a -= 1LL*red; swap(ans[row][mx], ans[row][mn]); exchanges++; } allocate_tickets(ans); return a; } /* for every i, j < k exchange the i th minimum and j th maximum each exchange costs x[i] + x[j] ... take the first nk/2 valid exchanges the actual order of the stuff doesnt matter you wanna choose nk/2 pairs to remove what happens when the stuff starts to overlap :thinkies: ...|..|... ..|.|.. */
#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...