제출 #321479

#제출 시각아이디문제언어결과실행 시간메모리
321479grtCarnival Tickets (IOI20_tickets)C++17
100 / 100
887 ms76612 KiB
#include <bits/stdc++.h>

using namespace std;

using vi = vector<int>;
using ll = long long;
using pi = pair<int,int>;

#define ST first
#define ND second
#define PB push_back

const int nax = 1500 + 10;
int take[nax];

void allocate_tickets(vector<vi> a);

ll find_maximum(int k, vector<vi>x) {
    int n = (int)x.size();
    int m = (int)x[0].size();
    ll ans = 0;
    for(int i = 0; i < k; ++i) {
        for(int j = 0; j < n; ++j) {
            ans -= x[j][i];
        }
    }
    priority_queue<pi>PQ;
    for(int i = 0; i < n; ++i) {
        take[i] = 0;
        PQ.push({x[i][m - 1] + x[i][k - 1], i});
    }
    int cur = 0;
    while(cur < n * k / 2) {
        cur++;
        pi tp = PQ.top();
        ans += tp.ST;
        PQ.pop();
        take[tp.ND]++;
        if(take[tp.ND] < k) {
            PQ.push({x[tp.ND][m - 1 - take[tp.ND]] + x[tp.ND][k - 1 - take[tp.ND]], tp.ND});
        }
    }
    vector<vi>res(n);
    for(int i = 0; i < n; ++i) res[i].resize(m, -1);
    vector<vector<bool>>t(n);
    for(int i = 0; i < n; ++i) t[i].resize(k+1);
    for(int turn = k - 1; turn >= 0; --turn) {
        cur = 0;
        for(int i = 0; i < n; ++i) {
            if(take[i] == turn + 1) {
                t[i][turn] = 1;
                cur++;
                continue;
            } else if(take[i] == 0) {
                t[i][turn] = 0;
                cur--;
                continue;
            }
        }
        for(int i = 0; i < n; ++i) {
            if(take[i] == turn + 1 || take[i] == 0) continue;
            if(cur < 0) {
                t[i][turn] = 1;
                cur++;
            } else {
                t[i][turn] = 0;
                cur--;
            }
        }
        for(int i = 0; i < n; ++i) {
            if(t[i][turn]) take[i]--;
        }
    }
    vi l(n, 0);
    vi r(n, m-1);
    for(int turn = 0; turn < k; ++turn) {
        for(int i = 0; i < n; ++i) {
            if(t[i][turn]) {
                res[i][r[i]--] = turn;
            } else {
                res[i][l[i]++] = turn;
            }
        }
    }
    allocate_tickets(res);
    //for(int i = 0; i < n; ++i) {
    //    for(int j = 0; j < m; ++j) {
    //        cout << res[i][j] << " ";
    //    }
    //    cout << "\n";
    //}
    return ans;
}

//int main() {
 //   cout << find_maximum(2, {{0, 2, 5},{1, 1, 3}}) << "\n";
 //   cout << find_maximum(1, {{5, 9}, {1, 4}, {3, 6}, {2, 7}}) << "\n";
//}

#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...