본문 바로가기
Solved.ac/Class 7

[BOJ] 백준 13537번: 수열과 쿼리 1

by 강성주의 알고리즘 2020. 6. 22.

머지 소트 트리 + 이분탐색

아래글 참고.

2020/08/17 - [알고리즘] - 머지 소트, 머지 소트 트리 및 관련 백준 문제 풀이

#include <iostream>
#include <algorithm>
#include <memory.h>
#include <vector>
#include <queue>
#include <stack>

using namespace std;
typedef long long ll;

int n, m, k;
int arr[100001];
int mst[17][100002] = { 0, };
void make_tree(int s, int e,int depth) {
	if (s == e) {
		mst[depth][s] = arr[s];
	}
	else {
		int mid = (s + e) / 2;
		make_tree(s, mid, depth + 1);
		make_tree(mid + 1, e, depth + 1);
		int i = s, j = mid + 1;
		int idx = s;
		while (i <= mid && j <= e) {
			if (mst[depth+1][i] < mst[depth+1][j]) {
				mst[depth][idx] = mst[depth + 1][i];
				i += 1;
			}
			else {
				mst[depth][idx] = mst[depth + 1][j];
				j += 1;
			}
			idx += 1;
		}
		while (i <= mid) {
			mst[depth][idx] = mst[depth + 1][i];
			i += 1;
			idx += 1;
		}
		while (j <= e) {
			mst[depth][idx] = mst[depth + 1][j];
			j += 1;
			idx += 1;
		}
	}
}
int query(int s, int e,int depth, int num,int ds,int de) {
	if (s == ds && e == de) { // 겹침
		// 이분탐색 upper_bound
		int _s = s, _e = e;
		int mid;
		while (_s <= _e) {
			mid = (_s + _e) / 2;
			if (mst[depth][mid] > num) {
				_e = mid - 1;
			}
			else {
				_s = mid + 1;
			}
		}
		return e- _e;
	}
	int mid = (s + e) / 2;
	if (mid < ds) {
		return query(mid + 1, e, depth + 1, num, ds, de);
	}
	else if (mid >= de) {
		return query(s, mid, depth + 1, num, ds, de);
	}
	else {
		return query(s, mid, depth + 1, num, ds, mid) + query(mid + 1, e, depth + 1, num, mid + 1, de);
	}
}
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> arr[i];
	}
	make_tree(1, n,0);
	cin >> m;
	for (; m--;) {
		int s, e, c;
		cin >> s >> e >> c;			
		cout << query(1, n, 0, c, s, e) <<"\n";
	}
}
반응형

'Solved.ac > Class 7' 카테고리의 다른 글

[BOJ] 백준 11408번: 열혈강호 5  (0) 2020.06.22
[BOJ] 백준 1017번: 소수쌍  (0) 2020.06.17