Submission #1197962

#TimeUsernameProblemLanguageResultExecution timeMemory
1197962countlessCarnival Tickets (IOI20_tickets)C++20
27 / 100
306 ms60268 KiB
#include "tickets.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; const ll MOD = 998244353; const ll INF = 1e18; const ld EPS = 1e-12; #define endl "\n" #define sp <<" "<< #define REP(i, a, b) for(ll i = a; i < b; i++) #define dbg(x) cout << #x << " = " << x << endl #define mp make_pair #define pb push_back #define fi first #define se second #define fast_io() ios_base::sync_with_stdio(false); cin.tie(NULL) #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() #define sz(x) ((ll)(x).size()) struct custom_hash { static uint64_t splitmix64(uint64_t x) { // http://xorshift.di.unimi.it/splitmix64.c x += 0x9e3779b97f4a7c15; x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9; x = (x ^ (x >> 27)) * 0x94d049bb133111eb; return x ^ (x >> 31); } size_t operator()(uint64_t x) const { static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count(); return splitmix64(x + FIXED_RANDOM); } }; template <typename Key, typename Value> using hash_map = unordered_map<Key, Value, custom_hash>; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); // uniform_int_distribution<int>(a, b)(rng); // shuffle(all(a), rng); ll find_maximum(int k, vector<vector<int>> x) { ll n = x.size(); ll m = x[0].size(); assert(k == 1); ll ans = 0; // sort by val, keep track of pos vector<vector<int>> pos(n, vector<int>(m)); REP(i, 0, n) { REP(j, 0, m) { pos[i][j] = j; } sort(all(pos[i]), [&](const int &a, const int &b) -> bool { return x[i][a] < x[i][b]; }); } auto find = [&](const int &i, const int &j) { return x[i][pos[i][j]]; }; priority_queue<pair<int, int>> pq; // b will always be median // ans will always be greatest n/2 minus smallest n/2 REP(i, 0, n) { // take smallest k ans -= find(i, 0); pq.push({find(i, m-1) + find(i, 0), i}); } // take greatest n/2 paired with its smallest to balance sum properly vector<bool> use(n, false); REP(i, 0, n / 2) { pair<int, int> cand = pq.top(); pq.pop(); ans += cand.first; use[cand.second] = true; } vector<vector<int>> g(n, vector<int>(m, -1)); // apply REP(j, 0, n) { if (use[j]) { g[j][pos[j][m-1]] = 0; } else { g[j][pos[j][0]] = 0; } } allocate_tickets(g); 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...