Advertisement
Guest User

cpp.cpp

a guest
Apr 19th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.25 KB | None | 0 0
  1. #pragma GCC optimize "-O3"
  2.  
  3. #include <bits/stdc++.h>
  4.  
  5. using namespace std;
  6.  
  7. const int N = 3030;
  8. const int M = 100100;
  9.  
  10. inline int read() {
  11.     int ans = 0; char ch;
  12.     for (ch = getchar(); ch < 48 || ch > 57; ch = getchar());
  13.     for (; ch >=  48 && ch <= 57; ch = getchar())
  14.         ans = (ans << 3) + (ans << 1) + (ch - 48);
  15.     return ans;
  16. }
  17.  
  18. struct info {
  19.   int l, r, x, y;
  20.   info(int l = 0,int r = 0,int x = 0,int y = 0) : l(l), r(r), x(x), y(y) {}
  21.   bool operator < (const info &b) const {
  22.     return make_pair(l, r) < make_pair(b.l, b.r);
  23.   }
  24. };
  25.  
  26. int n, m, k;
  27. int a[N][N];
  28. info val[N][N];
  29. set<info> s[M];
  30. int ad[N << 2], mx[N << 2];
  31. int64_t sm[N << 2];
  32.  
  33. void push(int v,int l,int r) {
  34.   if (ad[v]) {
  35.     mx[v] += ad[v];
  36.     sm[v] += (int64_t) ad[v] * (r - l + 1);
  37.     if (l < r) {
  38.       ad[v << 1] += ad[v];
  39.       ad[v << 1 | 1] += ad[v];
  40.     }
  41.     ad[v] = 0;
  42.   }
  43. }
  44.  
  45. void pull(int v) {
  46.   mx[v] = max(mx[v << 1], mx[v << 1 | 1]);
  47.   sm[v] = sm[v << 1] + sm[v << 1 | 1];
  48. }
  49.  
  50. void upd(int v,int l,int r,int L,int R,int x) {
  51.   push(v, l, r);
  52.   if (L > r || R < l) return;
  53.   if (L <= l && r <= R) {
  54.     ad[v] = x;
  55.     push(v, l, r);
  56.     return;
  57.   }
  58.   int md = (l + r) >> 1;
  59.   upd(v << 1, l, md, L, R, x);
  60.   upd(v << 1 | 1, md + 1, r, L, R, x);
  61.   pull(v);
  62. }
  63.  
  64. void debug(int v,int l,int r) {
  65.   push(v, l, r);
  66.   if (v == 1) cout << '\n';
  67.   if (l == r) {
  68.     cout << mx[v] << ' ';
  69.   } else {
  70.     int md = (l + r) >> 1;
  71.     debug(v << 1, l, md);
  72.     debug(v << 1 | 1, md + 1, r);
  73.   }
  74.   if (v == 1) { cout << '\n';
  75.   }
  76. }
  77.  
  78. void add(int x,int y,int l,int r) {
  79.   int v = a[x][y];
  80.  
  81.   auto &s = ::s[v];
  82.   auto it = s.lower_bound(info(l, l, 0, 0));
  83.   if (it != s.begin()) {
  84.     --it;
  85.     if (it->r < l) it++;
  86.   }
  87.   vector<info> toadd;
  88.   vector<info> todel;
  89.   while (it != s.end()) {
  90.     int xx = it->x, yy = it->y, ll = it->l, rr = it->r;
  91.     int tl = max(l, ll), tr = min(r, rr);
  92.     if (tl > tr) break;
  93.     upd(1, 1, m - k + 1, tl, tr, -1);
  94.     if (tl == ll && tr == rr) {
  95.       todel.push_back(*it);
  96.       val[xx][yy] = {0, 0, xx, yy};
  97.     } else if (ll < l) {
  98.       todel.push_back(*it);
  99.       val[xx][yy] = {ll, l - 1, xx, yy};
  100.       toadd.push_back(val[xx][yy]);
  101.     } else {
  102.       todel.push_back(*it);
  103.       val[xx][yy] = {r + 1, rr, xx, yy};
  104.       toadd.push_back(val[xx][yy]);
  105.     }
  106.     it++;
  107.   }
  108.   for (auto u : toadd) s.insert(u);
  109.   for (auto u : todel) s.erase(u);
  110.   val[x][y] = {l, r, x, y};
  111.   s.insert(val[x][y]);
  112.   upd(1, 1, m - k + 1, l, r, 1);
  113. }
  114.  
  115. void del(int x,int y) {
  116.   int v = a[x][y];
  117.   auto &s = ::s[v];
  118.   int l = val[x][y].l, r = val[x][y].r;
  119.   if (l && r) {
  120.     s.erase(info(l, r, x, y));
  121.     upd(1, 1, m - k + 1, l, r, -1);
  122.   }
  123. }
  124.  
  125. int main() {
  126.   n = read(), m = read(), k = read();
  127.   for (int i = 1; i <= n; ++i) {
  128.     for (int j = 1; j <= m; ++j) {
  129.       a[i][j] = read();
  130.     }
  131.   }
  132.  
  133.   int mx = 0;
  134.   int64_t sm = 0;
  135.   for (int i = 1; i <= n; ++i) {
  136.     for (int j = 1; j <= m; ++j) {
  137.       int l = max(1, j - k + 1);
  138.       int r = min(j, m - k + 1);
  139.       add(i, j, l, r);
  140.     }
  141.     if (i > k) {
  142.       for (int j = 1; j <= m; ++j) {
  143.         del(i - k, j);
  144.       }
  145.     }
  146.     if (i >= k) {
  147.       mx = max(mx, ::mx[1]);
  148.       sm += ::sm[1];
  149.     }
  150.   }
  151.   printf("%d %lld\n", mx, sm);
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement