https://www.acmicpc.net/problem/2143
이 문제는 일단 누적합을 이용해서 구간들의 합을 구해야 하는데 구간합간의 단순 비교를 하면 시간 초과가 뜨기 때문에 이문제의 경우 일단 한 배열의 구간 합들을 따로 저장 해놓고 이를 정렬한 후 이분탐색으로 그값의 하위 인덱스와 상위인덱스의 차를 더해주면 된다
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> valOfA;
vector<int> valOfB;
vector<int> cmpB;
int main() {
cin.tie(NULL);
cout.tie(NULL);
iostream::sync_with_stdio(false);
int t;
int n, m;
cin >> t;
cin >> n;
valOfA.resize(n + 1,0);
int tmp;
for (int i = 1; i <= n; i++) {
cin >> tmp;
valOfA[i] = tmp + valOfA[i - 1];
}
cin >> m;
valOfB.resize(m + 1, 0);
for (int i = 1; i <= m; i++) {
cin >> tmp;
valOfB[i] = tmp+ valOfB[i - 1];
}
for (int i = 0; i <= m; i++) {
for (int j = i+1 ; j <= m; j++) {
cmpB.push_back(valOfB[j] - valOfB[i]);
}
}
sort(cmpB.begin(), cmpB.end());
int start = 1;
int subAarr = 0;
long long ans = 0;
for (int i = 0; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
subAarr =valOfA[j] - valOfA[i];
subAarr = -(subAarr)+t;
int lowIdx = lower_bound(cmpB.begin(), cmpB.end(),subAarr) - cmpB.begin();
int upIdx = upper_bound(cmpB.begin(), cmpB.end(), subAarr) - cmpB.begin();
ans += upIdx - lowIdx;
}
}
cout << ans;
}
'백준(코테준비) > 이분탐색' 카테고리의 다른 글
백준 7453 / C++ / 이분탐색 / 투포인터 (0) | 2025.01.24 |
---|---|
백준 1253 / CPP / 이분탐 (0) | 2025.01.13 |
백준 12738 (1) | 2024.12.02 |
백준 3079/ c++ (0) | 2024.10.21 |