#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)
using namespace std;
int main(){
fastio;
int n,m,a; cin>>n>>m;
vector<int> v;
for(int i=0; i<n;i++){
cin>>a;
v.push_back(a); //점의 좌표
}
sort(v.begin(), v.end());
for(int i=0; i<m; i++){
int a,b; cin>>a>>b;
long long first = lower_bound(v.begin(), v.end(), a) - v.begin();
long long second = upper_bound(v.begin(), v.end(), b) - v.begin();
cout<<second-first<<'\n';
}
}
<풀이>
lower_bound(v.begin(), v.end(), a)
: lower_bound는 정렬된 범위에서 a 이상의 첫 번째 위치를 반환한다. 반환값은 해당 위치의 반복자(iterator) 이다.
upper_bound(v.begin(), v.end(), b)
:upper_bound는 정렬된 범위에서 b보다 큰 값의 첫 번째 위치를 반환한다.
이후
반복자 자체로는 인덱스 값을 제공하지 않기 때문에, 벡터의 시작 위치를 나타내는 반복자 v.begin()을 빼서 인덱스 값을 얻는다.
또한
lower_bound: x 이상 값의 첫 번째 위치 (구간의 시작 위치)
upper_bound: x보다 큰 값의 첫 번째 위치 (구간의 끝 이후 위치)
<예시>
v = {1, 3, 3, 5, 7};
a = 3, b = 5;
- lower_bound(v.begin(), v.end(), 3):
3 이상의 첫 번째 값의 위치 → 1 (인덱스 1).
- upper_bound(v.begin(), v.end(), 5):
5보다 큰 첫 번째 값의 위치 → 4 (인덱스 4).
'백준일지' 카테고리의 다른 글
[백준] 2470번 두 용액 (0) | 2025.01.18 |
---|---|
[백준] 2343번 기타레슨 (0) | 2025.01.16 |
[백준] 1654번 랜선 자르기 (0) | 2025.01.14 |
[백준] 2776번 암기왕 (0) | 2025.01.13 |
[C++] STL 알고리즘: Sort (0) | 2024.09.13 |