반응형
https://www.acmicpc.net/problem/5817
5817번: 고통받는 난쟁이들
옛날 옛적, 일곱 언덕과 일곱 바다를 건너 작은 마을이 있었어요. 백설공주는 놀고 먹고 자다가 일어나서 문명 5, 리그 오브 레전드, 풋볼 매니저를 하다가 다시 자는 난쟁이들 N명과 살고 있었어
www.acmicpc.net
[ 문제풀이 ]
이 문제를 풀기 전에 다음 글을 먼저 읽고 오시는 것을 추천드립니다.
https://rudalsd.tistory.com/51
[ 자료구조 ] 세그먼트 트리 (Segment Tree)
1. 세그먼트 트리 (Segment Tree) 먼저, 세그먼트 트리가 무엇인지 알아봅시다! 세그먼트 트리는 구간 합을 저장하기 위한 트리입니다. 예를 들어 size가 5인 배열이 있다고 생각해봅시다. int arr [5] = {1
rudalsd.tistory.com
1. 난쟁이들의 키를 입력 받고, 난쟁이들의 키를 인덱스로, 난쟁이들의 위치를 값으로하는 세그먼트 트리를 만듭니다.
2. 각 노드에는 구간의 최댓값과 최솟값을 각각 저장합니다.
3. 해당 구간의 최댓값과 최솟값의 차이가 Y - X와 같다면 YES를 아니라면 NO를 출력합니다.
[ 소스코드 ]
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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | #include<iostream> using namespace std; int N, M; pair<int,int> segTree[524444]; int arr[200000]; int Min, Max; void updateTree(int node, int s, int e, int idx, int n) { if (idx < s || e < idx) return; if (s == e) { segTree[node] = { n, n }; return; } int m = (s + e) / 2; updateTree(node * 2, s, m, idx, n); updateTree(node * 2 + 1, m + 1, e, idx, n); segTree[node].first = max(segTree[node * 2].first, segTree[node * 2 + 1].first); segTree[node].second = min(segTree[node * 2].second, segTree[node * 2 + 1].second); } void getTree(int node, int s, int e, int sidx, int eidx) { if (e < sidx || s > eidx) return; if (sidx <= s && e <= eidx) { Min = min(Min, segTree[node].second); Max = max(Max, segTree[node].first); return; } int m = (s + e) / 2; getTree(node * 2, s, m, sidx, eidx); getTree(node * 2 + 1, m + 1, e, sidx, eidx); } int main() { scanf("%d %d", &N, &M); for (int i = 1; i <= N; i++) { scanf("%d", &arr[i]); updateTree(1, 1, N, arr[i], i); } for (int i = 0; i < M; i++) { int cmd, X, Y; scanf("%d %d %d", &cmd, &X, &Y); if (cmd == 1) { updateTree(1, 1, N, arr[Y], X); updateTree(1, 1, N, arr[X], Y); swap(arr[X], arr[Y]); } else { Min = 987654321; Max = 0; getTree(1, 1, N, X, Y); if (Y - X == Max - Min) { printf("YES\n"); } else { printf("NO\n"); } } } } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 12919번 - A와 B 2 (C++) (0) | 2023.06.12 |
---|---|
[ 백준 ] 14463번 - 소가 길을 건너간 이유 9 (C++) (0) | 2023.06.11 |
[ 백준 ] 14449번 - Balanced Photo (C++) (0) | 2023.06.09 |
[ 백준 ] 11962번 - Counting Haybales (C++) (0) | 2023.06.08 |
[ 백준 ] 15816번 - 퀘스트 중인 모험가 (C++) (0) | 2023.06.07 |