Submission #771722

#TimeUsernameProblemLanguageResultExecution timeMemory
771722ono_de206Carnival Tickets (IOI20_tickets)C++14
25 / 100
689 ms70756 KiB
#include "tickets.h" #include<bits/stdc++.h> using namespace std; #define in insert #define all(x) x.begin(),x.end() #define pb push_back #define eb emplace_back #define ff first #define ss second // #define int long long typedef long long ll; typedef vector<int> vi; typedef set<int> si; typedef multiset<int> msi; typedef pair<int, int> pii; typedef vector<pii> vpii; int n, m, k; vector<vector<int>> answer, a; long long ret; void solve1() { vector<int> l(n), r(n); for(int i = 0; i < n; i++) { l[i] = 0; r[i] = m - 1; } for(int t = 0; t < k; t++) { vector<int> v(n, 0); priority_queue<pair<int, int>> q1, q2; for(int i = 0; i < n; i++) { ret -= a[i][l[i]]; q1.push({a[i][l[i]] + a[i][r[i]], i}); } while(1) { if(q1.size() > q2.size()) { auto i = q1.top(); q1.pop(); ret += i.ff; v[i.ss] ^= 1; q2.push({-i.ff, i.ss}); } else { auto i1 = q1.top(); auto i2 = q2.top(); q1.pop(); q2.pop(); if(i1.ff + i2.ff <= 0) break; v[i1.ss] ^= 1; v[i2.ss] ^= 1; ret += i1.ff + i2.ff; i1.ff *= -1; i2.ff *= -1; q1.push(i2); q2.push(i1); } } for(int i = 0; i < n; i++) { if(v[i] == 0) { answer[i][l[i]++] = t; } else { answer[i][r[i]--] = t; } } } } void solve2() { vector<int> l(n), r(n); vector<pair<int, int>> v; for(int i = 0; i < n; i++) { r[i] = m; for(int j = 0; j < m; j++) { v.eb(a[i][j], i); } } sort(all(v)); for(int i = 0; i < n * m / 2; i++) { ret += v[i + n * m / 2].ff - v[i].ff; l[v[i].ss]++; } for(int t = 0; t < m; t++) { v.clear(); for(int i = 0; i < n; i++) { v.eb(l[i], i); } sort(all(v)); for(int i = n - 1; i >= n / 2; i--) { answer[v[i].ss][--l[v[i].ss]] = t; } for(int i = 0; i < n / 2; i++) { answer[v[i].ss][--r[v[i].ss]] = t; } } } void solve3() { vector<int> l(n), r(n); for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { l[i] += (a[i][j] == 0); } r[i] = l[i]; } long long ret = 0; for(int t = 0; t < k; t++) { vector<int> v(n); iota(all(v), 0); sort(all(v), [&](int x, int y) { return l[x] > l[y]; }); int pos = n; for(int j = 0; j < n; j++) { int i = v[j]; if(l[i] == 0) { pos = j; break; } if(j >= n / 2 && r[i] < m) { pos = j; break; } } ret += min(pos, n - pos); for(int i = 0; i < pos; i++) { int id = v[i]; answer[id][--l[id]] = t; } for(int i = pos; i < n; i++) { int id = v[i]; answer[id][r[id]++] = t; } } } long long find_maximum(int _k, vector<vector<int>> LOL) { k = _k; a = LOL; n = a.size(); m = a[0].size(); answer = vector<vector<int>>(n, vector<int>(m, -1)); if(m == 1) { solve1(); } else if(k == m) { solve2(); } else { solve3(); } allocate_tickets(answer); return ret; }
#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...