#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
int N;
vector<int> A;
//A에서 이분 탐색으로 val값을 찾기 위해 필요한 비교 횟수 반환
ll binary_search(int value, int left, int right) {
int mid = (left + right) / 2;
if (A[mid] == value)
return 0;
else if (value < A[mid])
return 1LL + binary_search(value, left, mid - 1);
else
return 1LL + binary_search(value, mid + 1, right);
}
//A에서 삼분 탐색으로 val값을 찾기 위해 필요한 비교 횟수 반환
ll ternary_search(int value, int left, int right) {
int left_third = left + ((right - left) / 3);
int right_third = right - ((right - left) / 3);
if (A[left_third] == value)
return 0;
else if (A[right_third] == value)
return 1LL;
else if (value < A[left_third])
return 2LL + ternary_search(value, left, left_third - 1);
else if (value < A[right_third])
return 2LL + ternary_search(value, left_third + 1, right_third - 1);
else
return 2LL + ternary_search(value, right_third + 1, right);
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N;
for (int i = 0; i < N; ++i)
A.push_back(i);
int res1, res2, res3;
res1 = res2 = res3 = 0;
for (int i = 0; i < N; ++i) {
ll B, T;
B = binary_search(A[i], 0, N - 1);
T = ternary_search(A[i], 0, N - 1);
if (B < T) ++res1;
else if (B == T) ++res2;
else if (B > T) ++res3;
}
cout << res1 << "\n" << res2 << "\n" << res3;
return 0;
}
나의 풀이: 메모리 5220KB, 시간 60ms
빠른 풀이: 메모리 3972KB, 시간 4ms
더 빠른 풀이를 발견하였지만, 아직 이해하지 못했다
#include <algorithm>
#include <iostream>
using namespace std;
int cnt[500001] = { 0 };
void binAdd(int s, int e, int add) {
if (s > e) return;
int mid = (s + e) / 2;
cnt[mid] += add++;
binAdd(s, mid - 1, add);
binAdd(mid + 1, e, add);
}
void terSub(int s, int e, int sub) {
if (s > e) return;
if (s == e) {
cnt[s] -= sub;
return;
}
int t1 = s + (e - s) / 3;
int t2 = e - (e - s) / 3;
cnt[t1] -= sub++;
cnt[t2] -= sub++;
terSub(s, t1 - 1, sub);
terSub(t1 + 1, t2 - 1, sub);
terSub(t2 + 1, e, sub);
}
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
int N;
cin >> N;
binAdd(0, N - 1, 0);
terSub(0, N - 1, 0);
int res1, res2, res3;
res1 = res2 = res3 = 0;
for (int i = 0; i < N; i++) {
if (cnt[i] < 0) ++res1;
else if (cnt[i] == 0) ++res2;
else if (cnt[i] > 0) ++res3;
}
cout << res1 << "\n" << res2 << "\n" << res3;
return 0;
}