Advertisement
GerONSo

8 ЛКШ wa2

Apr 18th, 2019
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.77 KB | None | 0 0
  1. #define pragma
  2.  
  3. #ifdef pragma
  4. #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops")
  5. //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  6. #endif // pragma
  7.  
  8. #include<bits/stdc++.h>
  9. #include <ext/pb_ds/assoc_container.hpp>
  10. #include <ext/pb_ds/tree_policy.hpp>
  11.  
  12. #define ll long long
  13. #define all(x) begin(x), end(x)
  14. #define pb push_back
  15. #define x first
  16. #define y second
  17. #define int long long
  18. #define zero(two) memset(two, 0, sizeof(two))
  19.  
  20. using namespace std;
  21. using namespace __gnu_pbds;
  22.  
  23.  
  24. typedef vector<int> vi;
  25. typedef vector<bool> vb;
  26. typedef pair<int, int> pii;
  27. typedef long double ld;
  28. typedef vector<vi> matrix;
  29. template<typename T>
  30. using kawaii_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  31.  
  32. const ld PI = atan2(0, -1);
  33.  
  34. void seriy() {
  35. ios::sync_with_stdio(0);
  36. cin.tie(0);
  37. cout.tie(0);
  38. cout << fixed << setprecision(10);
  39. #if _offline
  40. freopen("input.txt", "r", stdin);
  41. freopen("output.txt", "w", stdout);
  42. #endif
  43. }
  44.  
  45. const int MAXN = 1e5 + 10;
  46. const int ALPH = 26;
  47. const int INF = 1e18 + 7;
  48. const int MAXLOG = 20;
  49. const int MOD = 998244353;
  50. const int BASE = 47;
  51.  
  52. struct edge {
  53. int u, v, w;
  54. };
  55.  
  56. vector<vector<pii>> g;
  57. vi pr, sz;
  58. vb used;
  59. vi ch, ch2, p;
  60. int n, m, t;
  61.  
  62. int get(int a) {
  63. if(pr[a] == a) return a;
  64. return pr[a] = get(pr[pr[a]]);
  65. }
  66.  
  67. void unite(int a, int b) {
  68. a = get(a);
  69. b = get(b);
  70. if(a != b) {
  71. if(sz[a] < sz[b]) {
  72. swap(a, b);
  73. }
  74. pr[b] = a;
  75. sz[a] += sz[b];
  76. }
  77. }
  78.  
  79. int bfs(int u) {
  80. used[u] = 1;
  81. set<pii> q;
  82. q.insert({0, u});
  83. int cnt = 0, mx = 0;
  84.  
  85. while(q.size()) {
  86. pii fr = *q.begin();
  87. q.erase(q.begin());
  88. // cerr << fr.x << " " << fr.y << '\n';
  89. mx = max(mx, fr.x);
  90. used[fr.y] = 1;
  91. ch.pb(fr.y);
  92. ch2.pb(fr.y);
  93. cnt++;
  94. if(cnt == t) {
  95. break;
  96. }
  97. for(auto v : g[fr.y]) {
  98. // cerr << fr.y << " " << v.x << " " << p[fr.y] << '\n';
  99. if(v.x != p[fr.y]) {
  100. q.insert({max(fr.x, v.y), v.x});
  101. p[v.x] = fr.y;
  102. ch2.pb(v.x);
  103. }
  104. }
  105. }
  106. // cerr << mx << '\n';
  107. // cerr << '\n';
  108. return mx;
  109. }
  110.  
  111. bool cmp(edge a, edge b) {
  112. return a.w < b.w;
  113. }
  114.  
  115. signed main() {
  116. seriy();
  117. cin >> n >> m >> t;
  118. int h[n][m];
  119. for(int i = 0; i < n; i++) {
  120. for(int j = 0; j < m; j++) {
  121. cin >> h[i][j];
  122. }
  123. }
  124. g.resize(n * m);
  125. sz.resize(n * m, 1);
  126. pr.resize(n * m);
  127. for(int i = 0; i < n * m; i++) {
  128. pr[i] = i;
  129. }
  130. int dx[4] = {-1, 1, 0, 0};
  131. int dy[4] = {0, 0, -1, 1};
  132. vector<edge> edges;
  133. for(int i = 0; i < n; i++) {
  134. for(int j = 0; j < m; j++) {
  135. for(int k = 0; k < 4; k++) {
  136. int tox = i + dx[k];
  137. int toy = j + dy[k];
  138. if(tox > -1 && tox < n && toy > -1 && toy < m) {
  139. edges.pb({i * m + j, tox * m + toy, abs(h[i][j] - h[tox][toy])});
  140. }
  141. }
  142. }
  143. }
  144. sort(all(edges), cmp);
  145. vector<pii> ed;
  146. for(auto i : edges) {
  147. if(get(i.u) != get(i.v)) {
  148. unite(i.u, i.v);
  149. g[i.u].pb({i.v, i.w});
  150. g[i.v].pb({i.u, i.w});
  151. ed.pb({i.u, i.v});
  152. ed.pb({i.v, i.u});
  153. }
  154. }
  155. // for(auto i : g[3]) {
  156. // cerr << i.y << " ";
  157. // }
  158. // cerr << '\n';
  159. used.resize(g.size());
  160. p.resize(g.size(), -1);
  161. vi ans(g.size(), INF);
  162.  
  163. for(auto j : ed) {
  164. int i = j.x;
  165. if(!used[i]) {
  166. // cerr << i << '\n';
  167. int kek = bfs(i);
  168. while(ch.size()) {
  169. // cerr << ch.back() << " " << ans[ch.back()] << " " << kek << '\n';
  170. ans[ch.back()] = min(ans[ch.back()], kek);
  171. ch.pop_back();
  172. }
  173. while(ch2.size()) {
  174. p[ch2.back()] = -1;
  175. ch2.pop_back();
  176. }
  177. // cerr << '\n';
  178. // for(int i = 0; i < n; i++) {
  179. // for(int j = 0; j < m; j++) {
  180. // cerr << ans[i * m + j] << " ";
  181. // }
  182. // cerr << '\n';
  183. // }
  184. // cerr << '\n';
  185. }
  186. }
  187.  
  188. int res = 0;
  189. for(int i = 0; i < n; i++) {
  190. for(int j = 0; j < m; j++) {
  191. int tmp;
  192. cin >> tmp;
  193. cerr << ans[i * m + j] << " ";
  194. if(tmp) {
  195. // cerr << ans[i * m + j] << " ";
  196. res += ans[i * m + j];
  197. }
  198. }
  199. cerr << '\n';
  200. }
  201. cout << res;
  202. return 0;
  203. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement