Advertisement
Combothermal

Untitled

Apr 10th, 2020
762
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.97 KB | None | 0 0
  1. void solve() {
  2. int N, M; cin >> N >> M;
  3. ll data[N][M]; F0R(i, N) F0R(j, M) cin >> data[i][j];
  4.  
  5. ll sum = 0; F0R(i, N) F0R(j, M) sum += data[i][j];
  6. bool in[N][M]; F0R(i, N) F0R(j, M) in[i][j] = true;
  7. int cnt = N*M;
  8. map<int, int> R[N], C[M];
  9. F0R(i, N) {
  10. F0R(j, M) {
  11. R[i].ins({j, data[i][j]});
  12. C[j].ins({i, data[i][j]});
  13. }
  14. }
  15. set<pi> check;
  16. ll ans = 0;
  17. F0R(i, N) F0R(j, M) check.ins({i, j});
  18. while (true) {
  19. int oc = cnt;
  20. ans += sum;
  21. set<pi> nc;
  22. set<pi> rem;
  23. for (auto cur : check) {
  24. if (!in[cur.f][cur.s]) continue;
  25. vl neis;
  26. vpi vals;
  27. if (cur.s != R[cur.f].begin()->f) {
  28. int pos = (--R[cur.f].find(cur.s))->f;
  29. vals.pb({cur.f, pos});
  30. }
  31. if (cur.s != R[cur.f].rbegin()->f) {
  32. int pos = (++R[cur.f].find(cur.s))->f;
  33. vals.pb({cur.f, pos});
  34. }
  35. if (cur.f != C[cur.s].begin()->f) {
  36. int pos = (--C[cur.s].find(cur.f))->f;
  37. vals.pb({pos, cur.s});
  38. }
  39. if (cur.f != C[cur.s].rbegin()->f) {
  40. int pos = (++C[cur.s].find(cur.f))->f;
  41. vals.pb({pos, cur.s});
  42. }
  43. ll cs = 0; F0R(i, sz(vals)) cs += data[vals[i].f][vals[i].s];
  44. // cout << cur.f << " " << cur.s << " " << cs << " " << sz(vals) << " " << cnt << endl;
  45. if (cs > data[cur.f][cur.s] * sz(vals)) {
  46. F0R(i, sz(vals)) rem.ins(vals[i]);
  47. nc.ins(cur);
  48. sum -= data[cur.f][cur.s];
  49. cnt--;
  50. in[cur.f][cur.s] = false;
  51. }
  52. }
  53.  
  54. for (auto cur : nc) {
  55. R[cur.f].erase(cur.s);
  56. C[cur.s].erase(cur.f);
  57. }
  58.  
  59. if (cnt == oc) break;
  60. check = rem;
  61. }
  62.  
  63. cout << ans << nl;
  64.  
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement