Cod sursa(job #3221640)

Utilizator deerMohanu Dominic deer Data 7 aprilie 2024 17:24:16
Problema Elimin Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <bits/stdc++.h>
#define fi first
#define se second

#define sz(a) int((a).size())
#define all(a) (a).begin(), (a).end()

#define lsb(x) (x & (-x))

#define YES { fout << "DA" << endl; return; }
#define NO { fout << "NU" << endl; return; }

using ll = long long;
using pii = std::pair<int, int>;

const int NMAX = 73e2;
using namespace std;
ifstream fin ("elimin.in");
ofstream fout ("elimin.out");
int n, m, r, c;
pii splin[NMAX + 5], spcol[NMAX + 5];
int solve1(){
    fin >> n >> m >> r >> c;
    int mat[n + 5][m + 5];
    bool bad[n + 5][m + 5];
    memset(mat, 0, sizeof(mat));
    memset(bad, false, sizeof(bad));
    for (int i = 1; i <= n; i++)
        splin[i] = {0, i};
    for (int j = 1; j <= m; j++)
        spcol[j] = {0, j};
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            fin >> mat[i][j], splin[i].fi += mat[i][j], spcol[j].fi += mat[i][j];
    sort(splin + 1, splin + n + 1);
    for (int i = 1; i <= r; i++) {
        for (int j = 1; j <= m; j++)
            bad[splin[i].se][j] = true, spcol[j].fi -= mat[splin[i].se][j];
    }
    sort(spcol + 1, spcol + m + 1);
    for (int j = 1; j <= c; j++){
        for (int i = 1; i <= n; i++)
            bad[i][spcol[j].se] = true;
    }
    int ans = 0;
    for (int i = 1; i <= n; i++){
        for (int j = 1; j <= m; j++)
            ans += (bad[i][j] == false) * mat[i][j];
    }
    fin.close();
    fin.open("elimin.in");
    return ans;
}
int solve2(){
    fin >> n >> m >> r >> c;
    int mat[n + 5][m + 5];
    bool bad[n + 5][m + 5];
    memset(mat, 0, sizeof(mat));
    memset(bad, false, sizeof(bad));
    for (int i = 1; i <= n; i++)
        splin[i] = {0, i};
    for (int j = 1; j <= m; j++)
        spcol[j] = {0, j};
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            fin >> mat[i][j], splin[i].fi += mat[i][j], spcol[j].fi += mat[i][j];
    sort(spcol + 1, spcol + m + 1);
    for (int j = 1; j <= c; j++){
        for (int i = 1; i <= n; i++)
            bad[i][spcol[j].se] = true, splin[i].fi -= mat[i][spcol[j].se];
    }
    sort(splin + 1, splin + n + 1);
    for (int i = 1; i <= r; i++) {
        for (int j = 1; j <= m; j++)
            bad[splin[i].se][j] = true;
    }
    int ans = 0;
    for (int i = 1; i <= n; i++){
        for (int j = 1; j <= m; j++)
            ans += (bad[i][j] == false) * mat[i][j];
    }
    fin.close();
    fin.open("elimin.in");
    return ans;
}
signed main() {
    fout << max(solve1(), solve2());
    return 0;
}