Submission #366928

#TimeUsernameProblemLanguageResultExecution timeMemory
366928wind_reaperCarnival Tickets (IOI20_tickets)C++17
16 / 100
666 ms51692 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<int64_t, 4>> b; for(int i = 0; i < n; i++){ for(int j = 1; j <= k; j++) b.push_back({x[i][k-j] + x[i][m-j], i, k-j, m-j}); } sort(b.begin(), b.end()); int e = 0; for(auto& [red, row, mn, mx] : b){ if(e == (n*k)/2){ break; } if(mn == mx){ e++; continue; } if(ans[row][mx] == -1 || ans[row][mn] != -1) continue; a -= 1LL*red; swap(ans[row][mx], ans[row][mn]); e++; } 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 ...|..|... ..|.|.. */
#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...