๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”ฅ PS(Problem Solving) ๐Ÿ”ฅ/BOJ

[BOJ] #2143 ๋‘ ๋ฐฐ์—ด์˜ ํ•ฉ

by dar0m! 2020. 8. 19.
์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ •๋‹ต ๋น„์œจ
2 ์ดˆ  64MB 27.919 %
 

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

 

๋ฌธ์ œ

ํ•œ ๋ฐฐ์—ด A[1], A[2], …, A[n]์— ๋Œ€ํ•ด์„œ, ๋ถ€ ๋ฐฐ์—ด์€ A[i], A[i+1], …, A[j-1], A[j] (๋‹จ, 1 ≤ i ≤ j ≤ n)์„ ๋งํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ถ€ ๋ฐฐ์—ด์˜ ํ•ฉ์€ A[i]+…+A[j]๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๊ฐ ์›์†Œ๊ฐ€ ์ •์ˆ˜์ธ ๋‘ ๋ฐฐ์—ด A[1], …, A[n]๊ณผ B[1], …, B[m]์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, A์˜ ๋ถ€ ๋ฐฐ์—ด์˜ ํ•ฉ์— B์˜ ๋ถ€ ๋ฐฐ์—ด์˜ ํ•ฉ์„ ๋”ํ•ด์„œ T๊ฐ€ ๋˜๋Š” ๋ชจ๋“  ๋ถ€ ๋ฐฐ์—ด ์Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์˜ˆ๋ฅผ ๋“ค์–ด A = {1, 3, 1, 2}, B = {1, 3, 2}, T=5์ธ ๊ฒฝ์šฐ, ๋ถ€ ๋ฐฐ์—ด ์Œ์˜ ๊ฐœ์ˆ˜๋Š” ๋‹ค์Œ์˜ 7๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

 

ํ•ด๊ฒฐ

key point, ๋ˆ„์ ํ•ฉ + ํˆฌํฌ์ธํ„ฐ. ์ž๋ฃŒํ˜•์€ long long!!
  1. A ๋ฐฐ์—ด๊ณผ B ๋ฐฐ์—ด์˜ ๋ˆ„์ ํ•ฉ์„ ๊ตฌํ•œ๋‹ค. → apSum, bpSum
  2. ๋ˆ„์ ํ•ฉ์„ ์ด์šฉํ•˜์—ฌ ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„ํ•ฉ์˜ ์กฐํ•ฉ์„ ๊ตฌํ•˜๊ณ  ์ •๋ ฌํ•œ๋‹ค. → A, B
  3. 38๋ฒˆ์ค„ ๋ถ€ํ„ฐ A์™€ B์˜ ๋ถ€๋ฐฐ์—ด ํ•ฉ์ด T๊ฐ€ ๋˜๋Š” ์ˆ˜๋ฅผ ํˆฌํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ•œ๋‹ค.
    1. ๊ฐ€์žฅ ์™ผ์ชฝ ํฌ์ธํ„ฐ l, ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ r์ด ์žˆ๋‹ค. l์€ A๋ฐฐ์—ด์˜ ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ , r์€ B๋ฐฐ์—ด์˜ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค.
    2. A[l] + B[r] = sum ์ด๋‹ค.
    3. ํ˜„์žฌ sum์ด T๋ณด๋‹ค
      1. ํฌ๋‹ค๋ฉด, sum์„ ์ค„์—ฌ์•ผ ํ•˜๋ฏ€๋กœ r์„ ์™ผ์ชฝ์œผ๋กœ ํ•œ ์นธ ๋‹น๊ฒจ B[r]์˜ ๊ฐ’์„ ์ค„์—ฌ์•ผ ํ•œ๋‹ค.
      2. ์ž‘๋‹ค๋ฉด, sum์„ ํ‚ค์›Œ์•ผ ํ•˜๋ฏ€๋กœ l์„ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ ์นธ ๋‹น๊ฒจ A[l]์˜ ๊ฐ’์„ ํ‚ค์›Œ์•ผ ํ•œ๋‹ค.
      3. ๊ฐ™๋‹ค๋ฉด
        1. A[l]์™€ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง„ ์›์†Œ๋ฅผ ๋ฐฐ์—ด A์—์„œ ๋ช‡ ๊ฐœ ์žˆ๋Š”์ง€ ์ฐพ๊ณ  → cntA
        2. B[r]์™€ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง„ ์›์†Œ๋ฅผ ๋ฐฐ์—ด B์—์„œ ๋ช‡ ๊ฐœ ์žˆ๋Š” ์ง€ ์ฐพ์•„ → cntB
        3. cntA์™€ cntB๋ฅผ ๊ณฑํ•ด์ค€ ๊ฐ’์ด ํ˜„์žฌ T๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜์ด๋‹ค.
        4. ๋˜ ๋‹ค๋ฅธ A[l]์™€ B[r]์˜ ์กฐํ•ฉ์œผ๋กœ T๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ sum์„ A[l] + B[r]๋กœ ๊ฐฑ์‹ ์‹œ์ผœ์ฃผ๊ณ  ๋ฐ˜๋ณต๋ฌธ์„ ๊ณ„์†ํ•œ๋‹ค.
  4. ๋ฐ˜๋ณต๋ฌธ์„ ๋‚˜๊ฐ€๊ณ ๋‚œ ํ›„ ans์ด ์ •๋‹ต์ด ๋œ๋‹ค. 

 

์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„
17640 KB 64 ms
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
#include <algorithm>
using namespace std;
int n, m;
long long t, a[1005], b[1005];
long long apSum[1005], bpSum[1005];
 
long long A[1000005], B[1000005];
 
int main() {
    scanf("%lld %d"&t, &n);
    for (int i = 1; i <= n; i++) {
        scanf("%lld"&a[i]);
        apSum[i] = apSum[i - 1+ a[i];
    }
    scanf("%d"&m);
    for (int i = 1; i <= m; i++) {
        scanf("%lld"&b[i]);
        bpSum[i] = bpSum[i - 1+ b[i];
    }
 
    int ap = 0, bp = 0;
    for (int i = 1; i <= n; i++) {
        for (int j = i; j <= n; j++) {
            A[ap++= apSum[j] - apSum[i - 1];
        }
    }
    for (int i = 1; i <= m; i++) {
        for (int j = i; j <= m; j++) {
            B[bp++= bpSum[j] - bpSum[i - 1];
        }
    }
    sort(A, A + ap);
    sort(B, B + bp);
 
    int l = 0, r = bp - 1;
    long long sum = A[l] + B[r], ans = 0;
    while (l < ap && r >= 0) {
        if (sum == t) {
            long long cntA = 0, cntB = 0;
            long long curA = A[l], curB = B[r];
            while (l < ap && A[l] == curA) {
                cntA++; l++;
            }
            while (r >= 0 && B[r] == curB) {
                cntB++; r--;
            }
            ans += cntA * cntB;
            sum = A[l] + B[r];
        }
        else if (sum > t) {
            sum -= B[r--]; sum += B[r];
        }
        else {
            sum -= A[l++]; sum += A[l];
        }
    }
    printf("%lld", ans);
    return 0;
}
cs

๋Œ“๊ธ€