문제: icpc.me/1999
n*n 행렬에 값이 주어져 있을 때 한 지점에서 부터 시작한 b*b 크기의 부분 행렬에서의 최댓값-최솟값을 출력하는 문제이다.
2차원 세그먼트 트리를 이용하면 O(K*NlogN)에 해결할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | #include <cstdio> #include <algorithm> #include <cstring> using namespace std; int n, b, k, minseg[251][250 * 4], maxseg[251][250 * 4], a[251][251]; int minupdate(int *tree, int pos, int val, int node, int x, int y) { if (y < pos || pos < x)return tree[node]; if (x == y)return tree[node] = val; int mid = (x + y) >> 1; return tree[node] = min(minupdate(tree, pos, val, node * 2, x, mid), minupdate(tree, pos, val, node * 2 + 1, mid + 1, y)); } int minquery(int *tree, int lo, int hi, int node, int x, int y) { if (y < lo || hi < x)return 1e9; if (lo <= x&&y <= hi)return tree[node]; int mid = (x + y) >> 1; return min(minquery(tree, lo, hi, node * 2, x, mid), minquery(tree, lo, hi, node * 2 + 1, mid + 1, y)); } int maxupdate(int *tree, int pos, int val, int node, int x, int y) { if (y < pos || pos < x)return tree[node]; if (x == y)return tree[node] = val; int mid = (x + y) >> 1; return tree[node] = max(maxupdate(tree, pos, val, node * 2, x, mid), maxupdate(tree, pos, val, node * 2 + 1, mid + 1, y)); } int maxquery(int *tree, int lo, int hi, int node, int x, int y) { if (y < lo || hi < x)return 0; if (lo <= x&&y <= hi)return tree[node]; int mid = (x + y) >> 1; return max(maxquery(tree, lo, hi, node * 2, x, mid), maxquery(tree, lo, hi, node * 2 + 1, mid + 1, y)); } int main() { scanf("%d%d%d", &n, &b, &k); memset(minseg, 0x3f, sizeof(minseg)); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { scanf("%d", &a[i][j]); minupdate(minseg[i], j, a[i][j], 1, 1, n); maxupdate(maxseg[i], j, a[i][j], 1, 1, n); } } while (k--) { int x, y; scanf("%d%d", &x, &y); int lo = 1e9, hi = 0; for (int i = x; i < x + b; i++) { lo = min(lo, minquery(minseg[i], y, y + b - 1, 1, 1, n)); hi = max(hi, maxquery(maxseg[i], y, y + b - 1, 1, 1, n)); } printf("%d\n", hi - lo); } return 0; } | cs |
'알고리즘 관련 > BOJ' 카테고리의 다른 글
BOJ)11560 다항식 게임 (0) | 2017.08.01 |
---|---|
BOJ)10276 Jewelry Exhibition (0) | 2017.08.01 |
BOJ)13511 트리와 쿼리2 (0) | 2017.07.31 |
BOJ)14657 준오는 최종인재야!! (0) | 2017.07.29 |
BOJ)2300 기지국 (0) | 2017.07.25 |