binary_search, lower_bound, upper_bound
μ λ ¬λμ΄ μλ λ°°μ΄, 컨ν μ΄λ λ±μ λμμΌλ‘ νμνλ€.
- binary_search: νμ λμμ΄ λλ κ°μ΄ μ‘΄μ¬νλμ§ νμΈνκ³ λ€μ΄ μλ€λ©΄ true, μλ€λ©΄ falseλ₯Ό λ°ννλ€.
- lower_bound: μ°Ύκ³ μ νλ κ° μ΄μμ΄ μ²μ λνλλ μμΉλ₯Ό λ°ννλ€.
- upper_bound: μ°Ύκ³ μ νλ κ°μ μ΄κ³Όνλ κ°μ΄ μ²μ λνλλ μμΉλ₯Ό λ°ννλ€.
λ¬Έμ
https://www.acmicpc.net/problem/12015
12015λ²: κ°μ₯ κΈ΄ μ¦κ°νλ λΆλΆ μμ΄ 2
첫째 μ€μ μμ΄ Aμ ν¬κΈ° N (1 ≤ N ≤ 1,000,000)μ΄ μ£Όμ΄μ§λ€. λμ§Έ μ€μλ μμ΄ Aλ₯Ό μ΄λ£¨κ³ μλ Aiκ° μ£Όμ΄μ§λ€. (1 ≤ Ai ≤ 1,000,000)
www.acmicpc.net
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(void)
{
int N;
cin >> N;
vector<int> v;
for (int i = 0; i < N; i++) {
int n;
cin >> n;
auto iter = lower_bound(v.begin(), v.end(), n);
if (iter == v.end())
v.push_back(n);
else
*iter = n;
}
cout << v.size();
}
λ¬Έμ : μ°Ύκ³ μ νλ κ°μ κ°μ ꡬνκΈ°
https://www.acmicpc.net/problem/10816
10816λ²: μ«μ μΉ΄λ 2
첫째 μ€μ μκ·Όμ΄κ° κ°μ§κ³ μλ μ«μ μΉ΄λμ κ°μ N(1 ≤ N ≤ 500,000)μ΄ μ£Όμ΄μ§λ€. λμ§Έ μ€μλ μ«μ μΉ΄λμ μ νμλ μ μκ° μ£Όμ΄μ§λ€. μ«μ μΉ΄λμ μ νμλ μλ -10,000,000λ³΄λ€ ν¬κ±°λ κ°κ³ , 10,
www.acmicpc.net
#include <iostream>
#include <algorithm>
using namespace std;
int num[500001];
int main()
{
int N;
cin >> N;
for (int i = 0; i < N; ++i)
cin >> num[i];
sort(num, num + N);
int M, tmp;
cin >> M;
for (int i = 0; i < M; ++i) {
cin >> tmp;
cout << upper_bound(num, num + N, tmp) - lower_bound(num, num + N, tmp) << " "; // κ°μ ꡬνκΈ°
}
}
https://www.acmicpc.net/problem/7453
7453λ²: ν©μ΄ 0μΈ λ€ μ μ
λ¬Έμ μ μλ‘ μ΄λ£¨μ΄μ§ ν¬κΈ°κ° κ°μ λ°°μ΄ A, B, C, Dκ° μλ€. A[a], B[b], C[c], D[d]μ ν©μ΄ 0μΈ (a, b, c, d) μμ κ°μλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€. μ λ ₯ 첫째 μ€μ λ°°μ΄μ ν¬κΈ° n (1 ≤ n ≤ 4000)μ΄ μ£Όμ΄μ§λ€. λ€μ nκ° μ€μλ A, B, C, Dμ ν¬ν¨λλ μ μκ° κ³΅λ°±μΌλ‘ ꡬλΆλμ΄μ Έμ μ£Όμ΄μ§λ€. λ°°μ΄μ λ€μ΄μλ μ μμ μ λκ°μ μ΅λ 228μ΄λ€. μΆλ ₯ ν©μ΄ 0μ΄ λλ μμ κ°μλ₯Ό μΆλ ₯νλ€. μμ μ λ ₯ 1 볡
www.acmicpc.net
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin >> n;
vector<int> A(n), B(n), C(n), D(n);
for (int i = 0; i < n; i++)
cin >> A[i] >> B[i] >> C[i] >> D[i];
vector<int> sumA, sumB;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
sumA.push_back(A[i] + B[j]);
sumB.push_back(C[i] + D[j]);
}
sort(sumA.begin(), sumA.end());
sort(sumB.begin(), sumB.end());
long long ans = 0;
for (int i = 0; i < sumA.size(); i++)
ans += upper_bound(sumB.begin(), sumB.end(), -sumA[i]) - lower_bound(sumB.begin(), sumB.end(), -sumA[i]);
cout << ans;
return 0;
}