티스토리 뷰

728x90

문제 링크

www.acmicpc.net/problem/2143

 

2143번: 두 배열의 합

첫째 줄에 T(-1,000,000,000 ≤ T ≤ 1,000,000,000)가 주어진다. 다음 줄에는 n(1 ≤ n ≤ 1,000)이 주어지고, 그 다음 줄에 n개의 정수로 A[1], …, A[n]이 주어진다. 다음 줄에는 m(1≤m≤1,000)이 주어지고, 그 다

www.acmicpc.net

 

풀이

백준 7453 - 합이 0인 네 정수 문제와 유사합니다.

위 문제에선 $a, b$의 모든조합, $c, d$의 모든 조합을 나눠 생각했고, 이 문제에서는 $a$의 모든 부분 배열의 합, $b$의 모든 부분 배열의 합을 구하여 같은 방식으로 답을 구하면 됩니다.

 

$[T - (a$의 부분 배열$_i$ 의 합)$]$이 $(b$의 모든 부분 배열의 합$)$을 저장해놓은 배열에 있는지 확인합시다.

 

정답 코드

#include <bits/stdc++.h>

#define INF 0x3f3f3f3f
#define ft first
#define sd second
#define all(x) (x).begin(), (x).end()
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using vi = vector<int>;
using vb = vector<bool>;
using vs = vector<string>;
using vd = vector<double>;
using vll = vector<ll>;
using vpii = vector<pii>;
using vvi = vector<vi>;
using vvb = vector<vb>;
using vvll = vector<vll>;
using vvpii = vector<vpii>;

int a[1111], b[1111];
int t, n, m;
vi p;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> t >> n;
    int sum = 0;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        sum += a[i];
        for (int j = 0, val = sum; j < i + 1; j++) {
            p.push_back(val);
            val -= a[j];
        }
    }
    sort(all(p));
    cin >> m;
    sum = 0;
    ll ans = 0;
    for (int i = 0; i < m; i++) {
        cin >> b[i];
        sum += b[i];
        for (int j = 0, val = sum; j < i + 1; j++) {
            ans += upper_bound(all(p), t - val) - lower_bound(all(p), t - val);
            val -= b[j];
        }
    }
    cout << ans;
}
728x90

'알고리즘 > 문제 풀이' 카테고리의 다른 글

[BOJ] 백준 2239 스도쿠  (0) 2021.03.08
[BOJ] 백준 2166 다각형의 면적  (0) 2021.03.08
[BOJ] 백준 1987 알파벳  (0) 2021.03.08
[BOJ] 백준 1806 부분합  (0) 2021.03.08
[BOJ] 백준 1799 비숍  (0) 2021.03.08
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/01   »
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 31
글 보관함