Advertisement
GerONSo

8 ЛКШ AC

Apr 20th, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.59 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. vector<vi> kek;
  58. vi pr, sz;
  59. vb used;
  60. vi ch, ch2, p, ans;
  61. int n, m, t;
  62.  
  63. int get(int a) {
  64. if(pr[a] == a) return a;
  65. return pr[a] = get(pr[pr[a]]);
  66. }
  67.  
  68. void dfs(int u, int w, int p) {
  69. ans[u] = w;
  70. for(auto v : kek[u]) {
  71. if(v != p) {
  72. dfs(v, w, u);
  73. }
  74. }
  75. }
  76.  
  77. void unite(int a, int b, int w) {
  78. a = get(a);
  79. b = get(b);
  80. if(a != b) {
  81. if(sz[a] < sz[b]) {
  82. swap(a, b);
  83. }
  84. // cerr << a << " " << b << '\n';
  85. if(sz[a] < t) {
  86. ans[a] = max(max(ans[a], ans[b]), w);
  87. }
  88. if(sz[b] < t) {
  89. ans[b] = max(max(ans[a], ans[b]), w);
  90. dfs(b, ans[b], -1);
  91. }
  92. pr[b] = a;
  93. kek[a].pb(b);
  94. sz[a] += sz[b];
  95. if(sz[a] >= t && !used[a]) {
  96. used[a] = 1;
  97. dfs(a, ans[a], -1);
  98. }
  99. }
  100. }
  101.  
  102. bool cmp(edge a, edge b) {
  103. return a.w < b.w;
  104. }
  105.  
  106. signed main() {
  107. seriy();
  108. cin >> n >> m >> t;
  109. int h[n][m];
  110. for(int i = 0; i < n; i++) {
  111. for(int j = 0; j < m; j++) {
  112. cin >> h[i][j];
  113. }
  114. }
  115. g.resize(n * m);
  116. kek.resize(n * m);
  117. sz.resize(n * m, 1);
  118. pr.resize(n * m);
  119. for(int i = 0; i < n * m; i++) {
  120. pr[i] = i;
  121. }
  122. int dx[4] = {-1, 1, 0, 0};
  123. int dy[4] = {0, 0, -1, 1};
  124. vector<edge> edges;
  125. for(int i = 0; i < n; i++) {
  126. for(int j = 0; j < m; j++) {
  127. for(int k = 0; k < 4; k++) {
  128. int tox = i + dx[k];
  129. int toy = j + dy[k];
  130. if(tox > -1 && tox < n && toy > -1 && toy < m) {
  131. edges.pb({i * m + j, tox * m + toy, abs(h[i][j] - h[tox][toy])});
  132. }
  133. }
  134. }
  135. }
  136. ans.resize(n * m);
  137. used.resize(n * m);
  138. sort(all(edges), cmp);
  139. for(auto i : edges) {
  140. if(get(i.u) != get(i.v) && (sz[i.u] < t || sz[i.v] < t)) {
  141. unite(i.u, i.v, i.w);
  142. }
  143. }
  144. int res = 0;
  145. for(int i = 0; i < n; i++) {
  146. for(int j = 0; j < m; j++) {
  147. int q;
  148. cin >> q;
  149. // cerr << q << " ";
  150. // cerr << ans[i * m + j] << " ";
  151. if(q) {
  152. res += ans[i * m + j];
  153. }
  154. }
  155. // cerr << '\n';
  156. }
  157. cout << res;
  158. return 0;
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement