[C++]이진 탐색 트리(높이2) - 백준2957
문제
풀이
문제 해석을 하자면,
- 이전에 풀었던
이진 검색 트리(높이)
풀이 게시글을 참고하길 바람.
풀이
- 시간초과를 조심해야하는 문제(편향 트리같은것들 조심)!! 또한, 입출력 부터 크니까 조심.
- BST를 구현하는건 그만두고, 최대한 set or map 자료구조(RBT) 활용해보겠다.
- RBT같은 균형트리는 편향 트리를 피할 수 있다.
-
문제를 보면, 카운터 C의 의미는 각 노드의 깊이(높이)를 해당 노드에 접근할때 까지 전부 더한 값이다.
- 이 더하는 값을 순서대로
resultArr
에 기록해서 한번에 출력하겠다.
- 이 더하는 값을 순서대로
- 이전에 풀었던
이진 검색 트리(높이)
풀이 게시글을 참고해서 풀겠다.
코드
#include<iostream>
#include<set>
using namespace std;
set<int> s;
int heights[300005];
long long resultArr[300005];
int main() {
// 입출력 속도 개선
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
long long result = 0;
int N;
int inNum;
cin >> N>>inNum; // 초기 inNum은 root값이고 C값이 루트 땐 0이다(문제확인)
heights[inNum] = 0; // 따라서 root는 높이 0부터 시작하자.
s.insert(inNum);
resultArr[0] = 0;
for (int i = 1; i < N; i++) {
cin >> inNum;
auto iter = s.lower_bound(inNum);
long long left, right;
if (iter != s.begin()) { // s.begin()은 root주소
auto left_iter = iter;
left = heights[*(--left_iter)]; // 해당 위치의 값을 인덱스로 heights배열 접근
}
else {
left = 0; // iter이 root면 left높이는 0
}
if (iter != s.end()) { // s.end()는 마지막 원소 다음 자리 주소
right = heights[*iter];
}
else {
right = 0; // iter이 마지막 원소 다음이란건 원소가 없단것(빈 트리)
}
heights[inNum] = max(left, right) + 1;
s.insert(inNum); // RBT에 삽입
result += heights[inNum]; // 구한 높이들 더하는중(C 구하는중)
resultArr[i] = result; // 순서대로 C 기록하는 중
}
for (int i = 0; i < N; i++) {
cout << resultArr[i] << '\n';
}
return 0;
}
느낀점
생략
댓글남기기