Submission #365320

#TimeUsernameProblemLanguageResultExecution timeMemory
365320valerikkCarnival Tickets (IOI20_tickets)C++17
100 / 100
853 ms75500 KiB
#ifdef EVAL
#include "tickets.h"
#endif
#include <bits/stdc++.h>
#define ll long long
using namespace std;

#ifndef EVAL 
vector<vector<int>> ans;
void allocate_tickets(vector<vector<int>> s) {
    ans =s;
}
#endif
int k, n, m;
ll x[1505][1505];
int t[1505];
int L[1505], R[1505];

ll find_maximum(int kk, vector<vector<int>> xx) {
    k = kk, n = (int)xx.size(),m = (int)xx[0].size();
    for(int i=0;i<n;i++) {
        for(int j= 0; j < m; j++)x[i][j] = xx[i][j];
    }
    ll S = 0;
    for(int i =0;i<n;i++) t[i] = 0;
    for(int i=0;i<n;i++){
        for(int j=0;j<k;j++) S-=x[i][j];
    }
    priority_queue<pair<ll,int>, vector<pair<ll, int>>, less<pair<ll,int>>> Q;
    for(int i= 0 ;i < n; i++) Q.push({x[i][m - 1]+x[i][k-1],i});
    for(int i = 0; i < n/2*k; i++) {
        int ind = Q.top().second;
        Q.pop();
        S+=x[ind][m-1-t[ind]]+x[ind][k-t[ind]-1];
        t[ind]++;
        if(t[ind]!=k)Q.push({x[ind][m-1-t[ind]]+x[ind][k-t[ind]-1],ind});
    }
    //return S;
    for(int i =0; i < n;i++) {
        //cout<<t[i]<< " ";
        L[i] = R[i] = 0;
    }
    //return S;
    vector<vector<int>> s(n, vector<int>(m, -1));
    for(int z = 0; z < k; z++) {
        vector<int> v, u, w;
        for(int i = 0; i < n; i++) {
            if(L[i] == k-t[i]) u.push_back(i); else if(R[i]==t[i]){ v.push_back(i); }else w.push_back(i);
        }
        assert((int)v.size()+(int)w.size()>=n/2);
        assert((int)u.size()+(int)w.size()>=n/2);
        int need = n/2 - (int)v.size();
        for(int i : v) {
            s[i][L[i]]=z;
            L[i]++;
        }
        for(int i:u) {
            s[i][m-R[i]-1]=z;
            R[i]++;
        }
        for(int i=0; i<need;i++) {
            s[w[i]][L[w[i]]]=z;
            L[w[i]]++;
        }
        for(int i=need;i<(int)w.size();i++){
            s[w[i]][m-R[w[i]]-1]=z;
            R[w[i]]++;
        }
    }
    allocate_tickets(s);
    return S;
}

#ifndef EVAL
int main() {
    freopen("D:/cp/oi/ioi/2020/input.txt", "r", stdin);
    int nn, mm, kk;
    cin>>nn>>mm>>kk;
    vector<vector<int>> xx(nn, vector<int>(mm));
    for(int i=  0; i < nn; i++){
        for(int j = 0; j < mm;j++)cin>>xx[i][j];
    }
    cout<<find_maximum(kk,xx)<<endl;
    //return 0;
    //return 0;
    for(int i = 0; i <nn; i++){
        for(int j = 0; j <mm; j++) cout<<ans[i][j]<<" ";
        cout<<endl;
    }
    return 0;
}
#endif


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