제출 #315598

#제출 시각아이디문제언어결과실행 시간메모리
315598VEGAnn카니발 티켓 (IOI20_tickets)C++14
27 / 100
756 ms53888 KiB
#include "tickets.h" #include <bits/stdc++.h> #define PB push_back #define sz(x) ((int)x.size()) #define all(x) x.begin(),x.end() #define i2 array<int,2> using namespace std; typedef long long ll; const int N = 1600; const ll OO = 1e18; priority_queue<i2> pq; int ptr[N], cand[N], siz[N]; bool was[N][N]; long long find_maximum(int k, vector<vector<int>> x) { int n = x.size(); int m = x[0].size(); vector<vector<int>> answer; for (int i = 0; i < n; i++) { std::vector<int> row(m); fill(all(row), -1); answer.push_back(row); } ll ans = 0; for (int i = 0; i < n; i++){ for (int j = 0; j < k; j++) ans += x[i][m - k + j]; ptr[i] = 0; cand[i] = 0; pq.push({-x[i][m - k] - x[i][0], i}); } // add again to pq only if ptr < m for (int itr = (n / 2) * k; itr > 0; itr--){ i2 now = pq.top(); pq.pop(); ans += now[0]; int id = now[1]; while (cand[id] < k && siz[cand[id]] == n / 2){ cand[id]++; } assert(cand[id] < k); was[id][cand[id]] = 1; siz[cand[id]]++; answer[id][ptr[id]] = cand[id]++; ptr[id]++; if (ptr[id] < k){ pq.push({-x[id][m - k + ptr[id]] - x[id][ptr[id]], id}); } } // add last tickets for (int i = 0; i < n; i++){ int now = 0; for (int j = ptr[i]; j < k; j++){ while (now < k && was[i][now]) now++; assert(now < k); was[i][now] = 1; answer[i][m - k + j] = now++; } } allocate_tickets(answer); 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...