-
1538-C, *1300코드포스 2021. 8. 1. 16:48
Problem - 1538C - Codeforces
codeforces.com
문제
- 크기가 n(1≤n≤2⋅105)인 수열 a1a2...an−1an이 주어진다
- l≤ai+aj≤r인 i, j(i≠j)의 개수를 구하라
O(nlog n)
먼저 준 수열을 sort 한다 O(nlog n)
이제 모든 원소 각각을 뽑았을 때, 조건을 만족하는 원소의 왼쪽 index와 오른쪽 index를 구해서 개수를 구한다
예를 들어 [l, r]=[5, 8], 수열을 [1, 2, 3, 4, 5] 라고 하자.
( ) 은 조건을 만족하는 수들이고 | 은 수를 뽑을 때 칸막이 오른쪽 수들만을 고려한다는 의미이다(∵조합)
i) 1을 무조건 뽑음
[1,|\ 2,\ 3,\ (4,\ 5)]
ii) 2를 무조건 뽑음
[1,\ 2,|\ (3,\ 4,\ 5)]
iii) 3을 무조건 뽑음
[1,\ 2,\ 3,|\ (4,\ 5)]
iv) 4를 무조건 뽑음
[1,\ 2,\ 3,\ 4,|\ 5()]
v) 5를 무조건 뽑음
[1,\ 2,\ 3,\ 4,\ 5()|]수들은 sort 되어있으므로 binary search 를 이용하여 왼쪽 index 와 오른쪽 index 를 구한다 O(nlog\ n)
12345678910111213141516171819202122232425262728293031#include <bits/stdc++.h>#define endl "\n"using namespace std;int n, l, r;int pl, pr;int main(){ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t;cin >> t;while(t--){cin >> n >> l >> r;vector<int> v(n);for(auto& e: v) cin >> e;sort(v.begin(), v.end());long long res = 0;for(int i = 0; i < n; i++){pl = lower_bound(v.begin()+i+1, v.end(), l-v[i])-v.begin();pr = upper_bound(v.begin()+i+1, v.end(), r-v[i])-v.begin();res += pr-pl;}cout << res << endl;}return 0;}cs'코드포스' 카테고리의 다른 글
1521-B, *1300 (0) 2021.08.01 1534-C, *1300 (0) 2021.08.01 1555-B, *1300 (0) 2021.07.31 1555-C, *1300 (0) 2021.07.31 1547-D, *1300 (0) 2021.07.30