Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 우선순위 큐
- 스택
- 시뮬레이션
- 자료구조
- Team Fortress 2
- VR
- 그래프
- 다익스트라
- XR Interaction Toolkit
- ue5
- 유니온 파인드
- 유니티
- 수학
- 누적 합
- Unreal Engine 5
- 그리디 알고리즘
- DFS
- c++
- 다이나믹 프로그래밍
- 정렬
- 백트래킹
- 구현
- 트리
- 재귀
- 투 포인터
- BFS
- 백준
- 브루트포스
- 문자열
- 알고리즘
Archives
- Today
- Total
1일1알
백준 2143번 두 배열의 합 C++ 본문

우선 A와 B의 모든 구간에서의 누적합들을 저장하는 벡터를 만든다.
A의 누적합과 B의 누적합을 더했을때 t가 되는 경우를 찾으면 되는데, 이분 탐색을 위해 둘중 하나를 정렬한다.
나는 B를 정렬했다.
A의 모든 원소를 탐색하면서 B의 원소의 값이 t - A[i]인 경우를 찾으면 되는데, 이때 lower_bound와 upper_bound를 사용했다. lower_bound와 upper_bound는 이분 탐색을 해주는 함수인데, 정렬이 되어있어야 사용이 가능하다. 그래서 앞에서 B를 정렬했다.
lower_bound는 찾고싶은 수보다 같거나 큰 인덱스를 반환하고
upper_bound는 찾고싶은 수보다 큰 인덱스를 반환한다.
ans에 (upper_bound의 반환값 - lower_bound의 반환값) 을 더해주면 된다.
그 이유는 만약 두 반환값이 같다면 찾고싶은 수와 같은 경우는 없어서 0이 되고
반환값이 다르다면 찾고싶은 수가 upper_bound의 반환값 - lower_bound의 반환값 만큼 있기 때문이다.
#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <list>
#include <unordered_map>
#include <unordered_set>
#include <iomanip>
#include <limits.h>
using namespace std;
using int64 = long long;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int t, n, m;
cin >> t;
cin >> n;
vector<int> A(n);
for (int i = 0; i < n; i++) {
cin >> A[i];
}
cin >> m;
vector<int> B(m);
for (int i = 0; i < m; i++) {
cin >> B[i];
}
vector<int> ASum;
vector<int> BSum;
for (int i = 0; i < n; i++) {
int sum = A[i];
ASum.push_back(sum);
for (int j = i + 1; j < n; j++) {
sum += A[j];
ASum.push_back(sum);
}
}
for (int i = 0; i < m; i++) {
int sum = B[i];
BSum.push_back(sum);
for (int j = i + 1; j < m; j++) {
sum += B[j];
BSum.push_back(sum);
}
}
sort(BSum.begin(), BSum.end());
int64 ans = 0;
for (auto a : ASum) {
int target = t - a;
auto lb = lower_bound(BSum.begin(), BSum.end(), target);
auto ub = upper_bound(BSum.begin(), BSum.end(), target);
ans += ub - lb;
}
cout << ans;
}
'알고리즘' 카테고리의 다른 글
백준 16724번 피리 부는 사나이 C++ (0) | 2022.07.22 |
---|---|
백준 2342번 Dance Dance Revolution C++ (0) | 2022.07.21 |
백준 1644번 소수의 연속합 C++ (0) | 2022.07.19 |
Judge - 1231 : 양궁 선수 순위 예측 C++ (0) | 2022.07.18 |
Judge - 1233 : 한기대 최고의 보안 시스템 C++ (0) | 2022.07.17 |