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+Mlog2N)
#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 |