BOJ 1999 - 최대최소

image.png

그냥 나이브하게 $O(n^3)$ 으로 가로부분에 대해서만 $B$ 길이의 가로로 최대값과 최소값을 각 칸에 대해서 모두 전처리해둔다.

그럼 정답은 $O(nk)$ 에 해결할 수 있다.

int mx[251][251], mn[251][251];
void solve() {
   int n, B, k;
   cin >> n >> B >> k;
   vvi b(n, vi(n));
   fv2(b);
   for (int y = 0; y < n; y++) {
      for (int x = 0; x + B - 1 < n; x++) {
         debug(y, x);
         mx[y][x] = mn[y][x] = b[y][x];
         for (int r = x + 1; r < x + B; r++) {
            mina(mn[y][x], b[y][r]);
            maxa(mx[y][x], b[y][r]);
         }
      }
   }
   debug(mx[0][2]);
   while (k--) {
      int sy, sx;
      cin >> sy >> sx, sy--, sx--;

      int mx1 = 0, mn1 = 1e9;
      for (int y = sy; y < sy + B; y++) {
         maxa(mx1, mx[y][sx]);
         mina(mn1, mn[y][sx]);
      }
      cout << mx1 - mn1 << endl;
   }
}

Tags:

Categories:

Updated:

Comments