Submission #300849

#TimeUsernameProblemLanguageResultExecution timeMemory
300849TemmieCarnival Tickets (IOI20_tickets)C++17
100 / 100
1391 ms78644 KiB
#include <bits/stdc++.h> typedef long long ll; typedef unsigned long long ull; void allocate_tickets(std::vector <std::vector <int>> s); int n, m; ull find_maximum(int k, std::vector <std::vector <int>> x) { n = x.size(); m = x[0].size(); ll r = 0; for (int i = 0; i < n; i++) for (int j = m - 1; j > m - 1 - k; j--) r += x[i][j]; std::vector <std::pair <int, int>> range(n, { -1, m - k }); std::priority_queue <std::pair <int, int>> pq; for (int i = 0; i < n; i++) pq.push({ - x[i][range[i].first + 1] - x[i][range[i].second], i }); for (int i = 0; i < (n * k) >> 1; i++) { auto p = pq.top(); pq.pop(); r += p.first; range[p.second].first++, range[p.second].second++; if (range[p.second].second == m) continue; pq.push({ - x[p.second][range[p.second].first + 1] - x[p.second][range[p.second].second], p.second }); } std::vector <std::vector <int>> mx(n), mn(n), mxi(n), mni(n); for (int i = 0; i < n; i++) { for (int j = 0; j <= range[i].first; j++) mn[i].push_back(x[i][j]), mni[i].push_back(j); for (int j = range[i].second; j < m; j++) mx[i].push_back(x[i][j]), mxi[i].push_back(j);; std::reverse(mn[i].begin(), mn[i].end()); std::reverse(mni[i].begin(), mni[i].end()); } std::vector <std::vector <int>> ans(n, std::vector <int> (m, -1)); for (int i = 0; i < k; i++) { int hasmn = 0; std::vector <int> mnmx(n, 0); std::priority_queue <std::pair <int, int>> pqq; for (int j = 0; j < n; j++) { if (mx[j].size()) { mnmx[j] = 1; if (mn[j].size()) { pqq.push({ - mn[j].back() - mx[j].back(), j }); } } else { mnmx[j] = -1; hasmn++; } } while (hasmn < (n >> 1)) { auto p = pqq.top(); pqq.pop(); mnmx[p.second] = -1; hasmn++; } for (int j = 0; j < n; j++) { if (mnmx[j] == 1) { ans[j][mxi[j].back()] = i; mx[j].pop_back(); mxi[j].pop_back(); } else { ans[j][mni[j].back()] = i; mn[j].pop_back(); mni[j].pop_back(); } } } allocate_tickets(ans); return r; }
#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...