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

[BOJ] #2632 ํ”ผ์žํŒ๋งค

by dar0m! 2021. 2. 5.
์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ •๋‹ต ๋น„์œจ
 2 ์ดˆ  128 MB 36.331 %
 

2632๋ฒˆ: ํ”ผ์žํŒ๋งค

์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ์†๋‹˜์ด ๊ตฌ๋งคํ•˜๊ณ ์ž ํ•˜๋Š” ํ”ผ์žํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” 2,000,000 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„์—๋Š” A, B ํ”ผ์ž์˜ ํ”ผ์ž์กฐ๊ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด ๋Š” ์ •์ˆ˜ m, n ์ด ์ฐจ๋ก€๋กœ ์ฃผ์–ด์ง„๋‹ค (3 ≤ m, n

www.acmicpc.net

 

๋ฌธ์ œ

ํ•ด๊ฒฐ

key point, ์›ํ˜•, ๋ˆ„์ ํ•ฉ, ๋ถ€๋ถ„ํ•ฉ, ์™„์ „ํƒ์ƒ‰
  1.  

    ๋ฐฐ์—ด ํฌ๊ธฐ ์œ ์˜ํ•˜๊ธฐ. ์ฒ˜์Œ์— ๋ฐฐ์—ด์„ ์ž‘๊ฒŒ ์žก์•„์„œ ๊ณ„์† ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚ฌ์—ˆ๋‹ค. → 5๋ฒˆ ์ค„

  2. ํ”ผ์ž๊ฐ€ ์›ํ˜•์ด๊ธฐ ๋•Œ๋ฌธ์— `์™ผ→์˜ค` ๋ฐฉํ–ฅ์œผ๋กœ ๋ˆ„์ ํ•ฉ์„ ๊ตฌํ•˜๊ณ , `์˜ค→์™ผ` ๋ฐฉํ–ฅ์œผ๋กœ๋„ ๋ˆ„์ ํ•ฉ์„ ๊ตฌํ•œ๋‹ค. → 13, 19๋ฒˆ ์ค„

  3. ๋ถ€๋ถ„ ํ•ฉ์„ ๊ตฌํ•  ๋•Œ๋Š” j๋ฅผ `i + n - 1` ์ด์ „๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค. → 23, 38๋ฒˆ ์ค„

    1. ์‹ค์ œ sumA, sumB ๋ฐฐ์—ด์€ n * 2, m * 2 ํฌ๊ธฐ์ด๊ธฐ ๋•Œ๋ฌธ์— n๊ฐœ ์”ฉ๋งŒ ํ™•์ธํ•˜๊ณ 

    2. ๋ถ€๋“ฑํ˜ธ๊ฐ€ <= ๊ฐ€ ์•„๋‹Œ < ์ธ ์ด์œ ๋Š” ํฌํ•จํ•˜์—ฌ i + n - 1๊นŒ์ง€ ํ™•์ธํ•˜๋ฉด ๊ทธ ๊ฐ’์€ sumA[n]์ด ๋˜๊ณ , i๊ฐ€ n๊นŒ์ง€ ๋ฐ˜๋ณต๋˜๋Š”๋™์•ˆ sumA[n]์ด ๊ณ„์†ํ•ด์„œ ๋ฐฐ์—ด์— ์ถ”๊ฐ€๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

  4. ๋ถ€๋ถ„ํ•ฉ์„ ๋‹ค ๊ตฌํ–ˆ๋‹ค๋ฉด ๋งˆ์ง€๋ง‰์— ์ „์ฒด ์ดํ•ฉ sumA[n], sumB[m]์„ a, b๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•œ๋‹ค. → 33 ๋ฒˆ ์ค„

    1. 3๋ฒˆ์—์„œ sumA[n], sumB[m] ์„ ์ œ์™ธํ•œ ๋ถ€๋ถ„ํ•ฉ์„ ๊ตฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€ํ•œ๋‹ค.

  5. A, B์ค‘ ํ•œ ์ข…๋ฅ˜๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ํ”ผ์ž๋ฅผ ํŒ๋งคํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ฐ๊ฐ ๊ณต์ง‘ํ•ฉ 0์„ a, b, ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•œ๋‹ค.

  6. ๊ฐ€๋Šฅํ•œ ๊ฐœ์ˆ˜๋ฅผ ํ—ค์•„๋ ค ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•œ๋‹ค. → 37๋ฒˆ for๋ฌธ.

    1. ์ด ๋ถ€๋ถ„์€ ๋งŽ์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋ฒˆ์—๋Š” 0์กฐ๊ฐ๋ถ€ํ„ฐ S ์กฐ๊ฐ๊นŒ์ง€ Aํ”ผ์ž์™€ Bํ”ผ์ž๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ–ˆ๋‹ค.

 

 

 

 

์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„
 13552 KB 180 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
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
int sumA[3010], sumB[3010], ans; // ๋ˆ„์ ํ•ฉ
int main() {
    int s, n, m;
    scanf("%d%d%d"&s, &n, &m);
    for (int i = 1, a; i <= n; i++) {
        scanf("%d"&a);
        sumA[i] = sumA[i - 1+ a;
    }
    for (int i = n + 1; i <= n * 2; i++// n -> 1 -> 2 -> 3 ... ๋ˆ„์ ํ•ฉ๊ตฌํ•ด์คŒ
        sumA[i] = sumA[i - n] + sumA[n];
    for (int i = 1, b; i <= m; i++) {
        scanf("%d"&b);
        sumB[i] = sumB[i - 1+ b;
    }
    for (int i = m + 1; i <= m * 2; i++// n -> 1 -> 2 -> 3 ... ๋ˆ„์ ํ•ฉ๊ตฌํ•ด์คŒ
        sumB[i] = sumB[i - m] + sumB[m];
 
    vector<int> a, b; // ๋‚˜์˜ฌ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„ ํ•ฉ - ๋ˆ„์ ํ•ฉ ํ™œ์šฉ
    for (int i = 1; i <= n; i++) {
        for (int j = i; j < i + n - 1; j++) {
            a.push_back(sumA[j] - sumA[i - 1]);
        }
    }
    for (int i = 1; i <= m; i++) {
        for (int j = i; j < i + m - 1; j++) {
            b.push_back(sumB[j] - sumB[i - 1]);
        }
    }
    a.push_back(sumA[n]); b.push_back(sumB[m]);
    a.push_back(0); b.push_back(0);
    sort(a.begin(), a.end());
    sort(b.begin(), b.end());
    for (int i = 0; i <= s; i++) {
        auto p1 = equal_range(a.begin(), a.end(), i);
        auto p2 = equal_range(b.begin(), b.end(), s - i);
        ans += (p1.second - p1.first) * (p2.second - p2.first);
    }
    printf("%d", ans);
    return 0;
}
cs

๋Œ“๊ธ€