Submission #1349936

#TimeUsernameProblemLanguageResultExecution timeMemory
1349936rmielamudNaan (JOI19_naan)C++20
29 / 100
4094 ms2516 KiB
#include <bits/stdc++.h>

using namespace std;

#define short int32_t
#define int int64_t
#define long __int128_t

const int inf{numeric_limits<int>::max() / 4};

short main() {
    #ifndef LOCAL
        ios_base::sync_with_stdio(false);
        cin.tie(nullptr);
    #endif

    int n, l;
    cin >> n >> l;

    vector v(n, vector<int>(l));

    for (auto& row : v) {
        for (int& val : row) {
            cin >> val;
        }
    }

    vector<int> sums(n);

    for (int i{0}; i < n; i++) {
        for (int j{0}; j < l; j++) {
            sums[i] += v[i][j];
        }
    }

    vector<int> order(n);
    iota(order.begin(), order.end(), 0);
    
    do {
        int pos{0};
        int a{0};
        int b{1};

        vector<int> as(n - 1);
        vector<int> bs(n - 1);
        bool found{true};

        for (int i{0}; i < n; i++) {
            int person{order[i]};
            int subtracted_a{0};
            int old_b{b};
            bool ok{false};

            while (pos < l) {
                if ((b - a) * v[person][pos] * n * old_b >= (sums[person] * old_b - subtracted_a * n) * b) {
                    ok = true;
                    break;
                }
                
                subtracted_a += (b - a) * v[person][pos] * old_b / b;
                a = 0;
                b = 1;
                pos++;
            }

            if (!ok) {
                found = false;
                break;
            }

            int new_a{sums[person] * old_b - subtracted_a * n};
            int new_b{v[person][pos] * n * old_b};
            new_a = new_a * b + a * new_b;
            new_b *= b;

            int g{gcd(new_a, new_b)};

            a = new_a / g;
            b = new_b / g;

            if (i < n - 1) {
                as[i] = a + pos * b;
                bs[i] = b;
            } else if (a > l * b) {
                found = false;
                break;
            }
        }

        if (found) {
            for (int i{0}; i < n - 1; i++) {
                cout << as[i] << " " << bs[i] << "\n";
            }

            vector<int> iorder(n);

            for (int i{0}; i < n; i++) {
                iorder[order[i]] = i;
            }

            for (int i : iorder) {
                cout << i + 1 << " ";
            }

            cout << "\n";
            return 0;
        }
    } while (next_permutation(order.begin(), order.end()));

    cout << "-1\n";

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...