Submission #300347

#TimeUsernameProblemLanguageResultExecution timeMemory
300347jtnydv25Carnival Tickets (IOI20_tickets)C++17
100 / 100
1311 ms72212 KiB
#include "tickets.h" #include<bits/stdc++.h> using namespace std; #define ll long long long long find_maximum(int k, vector<vector<int>> x) { int n = x.size(); int m = x[0].size(); vector<vector<ll>> f(n, vector<ll> (k + 1, 0)); vector<int> pluses(n); vector<int> minuses(n); set<pair<ll, int>> benefits; ll mx = 0; for(int i = 0; i < n; i++){ for(int j = 0; j < k; j++) f[i][0] -= x[i][j]; for(int r = 1; r <= k; r++){ f[i][r] = f[i][r - 1] + x[i][m - r] + x[i][k - r]; // f is concave :) } benefits.insert({f[i][1] - f[i][0], i}); minuses[i] = k; mx += f[i][0]; } for(int r = 1; r <= (n * k) / 2; r++){ auto it = *benefits.rbegin(); benefits.erase(it); int i = it.second; mx += it.first; pluses[i]++; minuses[i]--; if(pluses[i] != k) benefits.insert({f[i][pluses[i] + 1] - f[i][pluses[i]], i}); } vector<vector<int>> when(n, vector<int>(m, -1)); for(int r = 0; r < k; r++){ // choose n / 2 pluses, n / 2 minuses vector<int> perm(n, 0); iota(perm.begin(), perm.end(), 0); vector<int> hasOption(n); for(int i = 0; i < n; i++) hasOption[i] = pluses[i] && minuses[i]; sort(perm.begin(), perm.end(), [&](int i, int j){return hasOption[i] < hasOption[j];}); int balance = 0; for(int i : perm){ if(balance <= 0){ if(pluses[i]){ when[i][m - pluses[i]] = r; pluses[i]--; balance++; } else{ when[i][--minuses[i]] = r; balance--; } } else{ if(minuses[i]){ when[i][--minuses[i]] = r; balance--; } else{ when[i][m - pluses[i]] = r; pluses[i]--; balance++; } } } assert(balance == 0); } allocate_tickets(when); return mx; }
#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...