각 배열의 최대 크기가 1000이기 때문에 배열의 모든 부분합의 갯수는 500500이 최대가 된다. 두 배열의 모든 부분합을 정렬하고 이분탐색으로 T를 만족하는 조합의 갯수를 세면 된다.
T와 모든 배열의 값이 0이면 답이 int범위를 벗어나기 때문에 long long으로 선언해야한다.
#include <bits/stdc++.h>
#define fastio ios::sync_with_stdio(0), cin.tie(0)
using namespace std;
int A[1001], B[1001];
int T, n, m;
void input() {
fastio;
cin >> T >> n;
for(int i = 1; i <= n; ++i) {
cin >> A[i];
A[i] += A[i-1];
}
cin >> m;
for(int i = 1; i <= m; ++i) {
cin >> B[i];
B[i] += B[i-1];
}
}
// 모든 부분합
void getPsum(vector<int>& v, int sze, int* arr) {
v.reserve(sze*(sze+1)/2);
for(int i = 1; i <= sze; ++i) { //갯수
for(int j = i; j <= sze; ++j) { //starting index
v.push_back(arr[j] - arr[j-i]);
}
}
}
int main() {
input();
vector<int> psumA; getPsum(psumA, n, A); sort(psumA.begin(), psumA.end());
vector<int> psumB; getPsum(psumB, m, B); sort(psumB.begin(), psumB.end());
long long ans = 0;
for(int& a : psumA) {
ans += upper_bound(psumB.begin(), psumB.end(), T-a) - lower_bound(psumB.begin(), psumB.end(), T-a);
}
cout << ans;
}
백준 1339 단어 수학 혼내주기 (0) | 2021.08.01 |
---|---|
백준 7453 합이 0인 네 정수 혼내주기 (0) | 2021.08.01 |
백준 19598 최소 회의실 개수 혼내주기 (0) | 2021.08.01 |
백준 17281 ⚾ 혼내주기 (0) | 2021.08.01 |
백준 11000 강의실 배정 혼내주기 (0) | 2021.08.01 |
댓글 영역