Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void solve() {
- int N, M; cin >> N >> M;
- ll data[N][M]; F0R(i, N) F0R(j, M) cin >> data[i][j];
- ll sum = 0; F0R(i, N) F0R(j, M) sum += data[i][j];
- bool in[N][M]; F0R(i, N) F0R(j, M) in[i][j] = true;
- int cnt = N*M;
- map<int, int> R[N], C[M];
- F0R(i, N) {
- F0R(j, M) {
- R[i].ins({j, data[i][j]});
- C[j].ins({i, data[i][j]});
- }
- }
- set<pi> check;
- ll ans = 0;
- F0R(i, N) F0R(j, M) check.ins({i, j});
- while (true) {
- int oc = cnt;
- ans += sum;
- set<pi> nc;
- set<pi> rem;
- for (auto cur : check) {
- if (!in[cur.f][cur.s]) continue;
- vl neis;
- vpi vals;
- if (cur.s != R[cur.f].begin()->f) {
- int pos = (--R[cur.f].find(cur.s))->f;
- vals.pb({cur.f, pos});
- }
- if (cur.s != R[cur.f].rbegin()->f) {
- int pos = (++R[cur.f].find(cur.s))->f;
- vals.pb({cur.f, pos});
- }
- if (cur.f != C[cur.s].begin()->f) {
- int pos = (--C[cur.s].find(cur.f))->f;
- vals.pb({pos, cur.s});
- }
- if (cur.f != C[cur.s].rbegin()->f) {
- int pos = (++C[cur.s].find(cur.f))->f;
- vals.pb({pos, cur.s});
- }
- ll cs = 0; F0R(i, sz(vals)) cs += data[vals[i].f][vals[i].s];
- // cout << cur.f << " " << cur.s << " " << cs << " " << sz(vals) << " " << cnt << endl;
- if (cs > data[cur.f][cur.s] * sz(vals)) {
- F0R(i, sz(vals)) rem.ins(vals[i]);
- nc.ins(cur);
- sum -= data[cur.f][cur.s];
- cnt--;
- in[cur.f][cur.s] = false;
- }
- }
- for (auto cur : nc) {
- R[cur.f].erase(cur.s);
- C[cur.s].erase(cur.f);
- }
- if (cnt == oc) break;
- check = rem;
- }
- cout << ans << nl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement