제출 #1333706

#제출 시각아이디문제언어결과실행 시간메모리
1333706gelastropodIMO (EGOI25_imo)C++20
51 / 100
106 ms17304 KiB
#pragma GCC optimize("O3,inline")
#include <bits/stdc++.h>
using namespace std;
#define int long long

bool comp(pair<vector<int>, int>& a, pair<vector<int>, int>& b) {
    int sa = 0, sb = 0;
    for (int i : a.first) sa += i;
    for (int i : b.first) sb += i;
    if (sa == sb) return a.second > b.second;
    return sa < sb;
}

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int N, M, K, a, ans = 0; cin >> N >> M >> K;
    if (N == 2) {
        int s1 = 0, s2 = 0, swapped = 0;
        vector<int> A1, A2;
        for (int i = 0; i < M; i++) {
            cin >> a;
            A1.push_back(a);
            s1 += a;
        }
        for (int i = 0; i < M; i++) {
            cin >> a;
            A2.push_back(a);
            s2 += a;
        }
        if (s1 >= s2) {
            swap(A1, A2);
            swapped = 1;
        }
        sort(A1.begin(), A1.end(), greater<int>());
        sort(A2.begin(), A2.end());
        for (int i = 0; i <= M; i++) {
            for (int j = 0; j <= M; j++) {
                pair<int, int> r1 = { 0, i * K }, r2 = { 0, j * K };
                for (int k = i; k < M; k++) r1.first += A1[k], r1.second += A1[k];
                for (int k = j; k < M; k++) r2.first += A2[k], r2.second += A2[k];
                if (r1.second < r2.first || (r1.second == r2.first && swapped)) ans = max(ans, i + j);
            }
        }
        cout << N * M - ans << '\n';
        return 0;
    }
    if (N * M <= 16) {
        vector<pair<vector<int>, int>> A(N, pair<vector<int>, int>(vector<int>(M, 0), 0));
        for (int i = 0; i < N; i++) {
            A[i].second = i;
            for (int j = 0; j < M; j++) {
                cin >> a;
                A[i].first[j] = a;
            }
        }
        sort(A.begin(), A.end(), comp);
        for (int i = 0; i < (1LL << (N * M)); i++) {
            vector<pair<int, int>> rs(N, pair<int, int>(0, 0));
            int crnt = 0;
            for (int j = 0; j < N; j++) {
                for (int k = 0; k < M; k++) {
                    if (!(i & (1LL << (j * M + k)))) {
                        rs[j].second += K;
                        crnt++;
                        continue;
                    }
                    rs[j].first += A[j].first[k], rs[j].second += A[j].first[k];
                }
            }
            int die = 0;
            for (int j = 0; j < N - 1; j++) {
                if (rs[j].second < rs[j + 1].first || (rs[j].second == rs[j + 1].first && A[j].second > A[j + 1].second)) continue;
                die = 1;
                break;
            }
            if (!die) ans = max(ans, crnt);
        }
        cout << N * M - ans << '\n';
        return 0;
    }
    vector<pair<vector<int>, int>> A(N, pair<vector<int>, int>(vector<int>(M, 0), 0));
    vector<int> sums;
    for (int i = 0; i < N; i++) {
        A[i].second = i;
        int csum = 0;
        for (int j = 0; j < M; j++) {
            cin >> a;
            A[i].first[j] = a;
            csum += a;
        }
        sums.push_back(csum);
    }
    sort(A.begin(), A.end(), comp);
    sort(sums.begin(), sums.end());
    for (int i = 0; i < M; i++)
        ans += A[0].first[i] + (1 - A.back().first[i]);
    for (int i = 1; i < N; i++) {
        int s1 = 0, s2 = 0;
        for (int j = 0; j < M; j++) s1 += 1 - A[i - 1].first[j], s2 += A[i].first[j];
        ans += min(sums[i] - sums[i - 1] - (A[i].second > A[i - 1].second), s1 + s2);
    }
    cout << N * M - ans << '\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...