Submission #1018356

#TimeUsernameProblemLanguageResultExecution timeMemory
1018356vjudge1Carnival Tickets (IOI20_tickets)C++17
41 / 100
707 ms142448 KiB
#include <bits/stdc++.h>
#include "tickets.h"
using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ll> vll;
typedef vector<vll> vvll;
typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef vector<vii> vvii;
typedef vector<bool> vb;
typedef vector<vb> vvb;
#define ALL(x) begin(x), end(x)
#define pb push_back
#define mp make_pair
#define printBool(x) cout << ((x) ? "YES\n" : "NO\n")
#define printBoolR(x) {cout << ((x) ? "YES\n" : "NO\n"); return;}
inline ll nxt(){ll x;cin>>x;return x;}
#define fill_i(x) generate(ALL(x), nxt)

long long find_maximum(int k, std::vector<std::vector<int>> x) {
    int n = x.size(), m = x[0].size();


    vector<array<int,3>> numbs;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            numbs.pb({x[i][j], i, j});
        }
    }
    sort(ALL(numbs));

    vvi s(n, vi(m, -1));
    vvi rounds(k);
    vi ctr(n, 0);
    int p1 = 0, p2 = n*m-1;
    vector<vector<array<int, 3>>> biggies(n);
    vector<vector<array<int, 3>>> smalls(n);
    if (k == 1) {
        vector<pair<array<int,3>, array<int,3>>> L;
        for (int i = 0; i < n; i++) {
            ii MIN = {1e9, 1e9}, MAX = {-1,-1};
            for (int j = 0; j < m; j++) {
                MIN = min(MIN, {x[i][j], j});
                MAX = max(MAX, {x[i][j], j});
            }
            L.push_back({{MIN.first, i, MIN.second}, {MAX.first, i, MAX.second}});
        }

        sort(ALL(L), [](const pair<array<int,3>, array<int,3>>& a, const pair<array<int,3>, array<int,3>>&b) {
            return a.first[0] + a.second[0] > b.first[0] + b.second[0];
        });

        for (int i = 0; i < n/2; i++) biggies[L[i].second[1]].pb(L[i].second);
        for (int i = n/2; i < n; i++) smalls[L[i].first[1]].pb(L[i].first);

    } else 
    for (;;) {
        while (p1 < n*m && ctr[numbs[p1][1]] == k) p1++;
        if (p1 == n*m) break;
        smalls[numbs[p1][1]].push_back(numbs[p1]);
        ctr[numbs[p1][1]]++;
        p1++;

        while (ctr[numbs[p2][1]] == k) p2--;
        biggies[numbs[p2][1]].push_back(numbs[p2]);
        ctr[numbs[p2][1]]++;
        p2--;
    }

    vvb didInRound(n, vb(k, false));
    int i = 0, j = 0;
    for (int r = 0; r < n*k/2; r++) {
        while (j == smalls[i].size()) i++, j = 0;
        didInRound[i][r%k] = true;
        rounds[r%k].pb(smalls[i][j][0]);
        s[i][smalls[i][j][2]] = r%k;
        j++;
    }

    for (int i = 0; i < n; i++) {
        int j = 0;
        for (int r = 0; r < k; r++) if (!didInRound[i][r]) {
            rounds[r].pb(biggies[i][j][0]);
            s[i][biggies[i][j][2]] = r;
            j++;
        }
    }


    allocate_tickets(s);
    ll score = 0;
    for (int r = 0; r < k; r++) {
        sort(ALL(rounds[r]));
        int med = rounds[r][n/2];
        for (int i = 0; i < n; i++) score += abs(med - rounds[r][i]);
    }
    return score;
}

Compilation message (stderr)

tickets.cpp: In function 'long long int find_maximum(int, std::vector<std::vector<int> >)':
tickets.cpp:76:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<int, 3> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   76 |         while (j == smalls[i].size()) i++, j = 0;
      |                ~~^~~~~~~~~~~~~~~~~~~
#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...