Pagini recente » Cod sursa (job #135943) | preONI 2008, Runda 1, Clasele 5-8 | Cod sursa (job #1763344) | Circulatie | Cod sursa (job #3221640)
#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;
}