Submission #826766

#TimeUsernameProblemLanguageResultExecution timeMemory
826766Charizard2021Naan (JOI19_naan)C++17
100 / 100
838 ms147660 KiB
#include <bits/stdc++.h>
using namespace std;
bool operator <(pair<long long, long long> a, pair<long long, long long> b){
    return (__int128)a.first * b.second < (__int128)a.second * b.first;
}
int main(){
    long long n, m;
    cin >> n >> m;
    vector<long long> a(n);
    long long grid[n][m];
    long long pref[n][m];
    for(long long i = 0; i < n; i++){
        for(long long j = 0; j < m; j++){
            cin >> grid[i][j];
            grid[i][j] *= n;
            a[i] += grid[i][j];
        }
        a[i] /= n;
    }
    for(long long i = 0; i < n; i++){
        pref[i][0] = grid[i][0];
        for(long long j = 1; j < m; j++){
            pref[i][j] = pref[i][j - 1] + grid[i][j];
        }
    }
    vector<bool> visited(n, false);
    vector<vector<pair<long long, long long> > > val(n, vector<pair<long long, long long> >(n));
    for(long long i = 0; i < n; i++){
        long long cur = 0;
        long long idx2 = 0;
        for(long long j = 0; j < n - 1; j++){
            cur += a[i];
            while(idx2 < m && pref[i][idx2] < cur){
                idx2++;
            }
            long long val2 = 0;
            if(idx2 > 0){
                val2 = pref[i][idx2 - 1];
            }
            val[i][j] = make_pair(cur - val2 + idx2 * grid[i][idx2], grid[i][idx2]);
        }
    }
    vector<long long> res(n);
    for(long long i = 0; i < n - 1; i++){
        long long idx = -1;
        for(long long j = 0; j < n; j++){
            if(!visited[j]){
                if(idx == -1){
                    idx = j;
                }
                else if(val[j][i] < val[idx][i]){
                    idx = j;
                }
            }
        }
        res[i] = idx + 1;
        visited[idx] = true;
        cout << val[idx][i].first << " " << val[idx][i].second << "\n";
    }
    for(long long i = 0; i < n; i++){
        if(!visited[i]){
            res[n - 1] = i + 1;
        }
    }
    for(long long j = 0; j < n; j++){
        cout << res[j] << " ";
    }
    cout << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...