https://www.acmicpc.net/problem/13537
13537번: 수열과 쿼리 1
길이가 N인 수열 A1, A2, ..., AN이 주어진다. 이때, 다음 쿼리를 수행하는 프로그램을 작성하시오. i j k: Ai, Ai+1, ..., Aj로 이루어진 부분 수열 중에서 k보다 큰 원소의 개수를 출력한다.
www.acmicpc.net
풀이
- 기본적인 세그먼트 트리에서 노드의 값을 해당 노드 구간의 배열을 정렬된 상태로 가지는 머지 소트 트리를 이용
코드
- 시간복잡도: $O(NlogN + Mlog^2N)$
#include <bits/stdc++.h>
using namespace std;
#define all(v) (v).begin(), (v).end()
#define rall(v) (v).rbegin(), (v).rend()
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N;
cin >> N;
vector<vector<long long> > t(2 * N);
for (int i = 0; i < N; ++i) {
int num;
cin >> num;
t[N + i].push_back(num);
}
for (int i = N - 1; i >= 1; --i) {
t[i].resize(t[i << 1 | 1].size() + t[i << 1].size());
merge(all(t[i << 1 | 1]), all(t[i << 1]), t[i].begin());
}
auto query = [&](int l, int r, int k) {
int ret = 0;
for (l += N, r += N; l < r; l >>= 1, r >>= 1) {
if (l & 1) ret += t[l].end() - upper_bound(all(t[l]), k), ++l;
if (r & 1) --r, ret += t[r].end() - upper_bound(all(t[r]), k);
}
return ret;
};
int M;
cin >> M;
while (M--) {
int i, j, k;
cin >> i >> j >> k;
cout << query(i - 1, j, k) << '\n';
}
}
728x90
'PS > BOJ' 카테고리의 다른 글
백준 3033번: 가장 긴 문자열 (0) | 2022.02.20 |
---|---|
백준 2316번: 도시 왕복하기 2 (0) | 2022.02.20 |
백준 1126번: 같은 탑 (0) | 2022.02.18 |
백준 11377번: 열혈강호 3 (0) | 2022.02.18 |
백준 19585번: 전설 (0) | 2022.02.15 |