제출 #1333696

#제출 시각아이디문제언어결과실행 시간메모리
1333696gelastropodIMO (EGOI25_imo)C++20
0 / 100
0 ms344 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';
    }
    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...