์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ | ์ ๋ต ๋น์จ |
2 ์ด | 64MB | 27.919 % |
๋ฌธ์
ํ ๋ฐฐ์ด 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!!
- A ๋ฐฐ์ด๊ณผ B ๋ฐฐ์ด์ ๋์ ํฉ์ ๊ตฌํ๋ค. → apSum, bpSum
- ๋์ ํฉ์ ์ด์ฉํ์ฌ ๊ฐ๋ฅํ ๋ถ๋ถํฉ์ ์กฐํฉ์ ๊ตฌํ๊ณ ์ ๋ ฌํ๋ค. → A, B
- 38๋ฒ์ค ๋ถํฐ A์ B์ ๋ถ๋ฐฐ์ด ํฉ์ด T๊ฐ ๋๋ ์๋ฅผ ํฌํฌ์ธํฐ๋ฅผ ์ด์ฉํด์ ๊ตฌํ๋ค.
- ๊ฐ์ฅ ์ผ์ชฝ ํฌ์ธํฐ l, ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ํฌ์ธํฐ r์ด ์๋ค. l์ A๋ฐฐ์ด์ ๊ฐ์ฅ ์์ ์์๋ฅผ ๊ฐ๋ฆฌํค๊ณ , r์ B๋ฐฐ์ด์ ๊ฐ์ฅ ํฐ ๊ฐ์ ๊ฐ๋ฆฌํค๊ณ ์๋ค.
- A[l] + B[r] = sum ์ด๋ค.
- ํ์ฌ sum์ด T๋ณด๋ค
- ํฌ๋ค๋ฉด, sum์ ์ค์ฌ์ผ ํ๋ฏ๋ก r์ ์ผ์ชฝ์ผ๋ก ํ ์นธ ๋น๊ฒจ B[r]์ ๊ฐ์ ์ค์ฌ์ผ ํ๋ค.
- ์๋ค๋ฉด, sum์ ํค์์ผ ํ๋ฏ๋ก l์ ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ ๋น๊ฒจ A[l]์ ๊ฐ์ ํค์์ผ ํ๋ค.
- ๊ฐ๋ค๋ฉด,
- A[l]์ ๊ฐ์ ๊ฐ์ ๊ฐ์ง ์์๋ฅผ ๋ฐฐ์ด A์์ ๋ช ๊ฐ ์๋์ง ์ฐพ๊ณ → cntA
- B[r]์ ๊ฐ์ ๊ฐ์ ๊ฐ์ง ์์๋ฅผ ๋ฐฐ์ด B์์ ๋ช ๊ฐ ์๋ ์ง ์ฐพ์ → cntB
- cntA์ cntB๋ฅผ ๊ณฑํด์ค ๊ฐ์ด ํ์ฌ T๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ์ ์์ด๋ค.
- ๋ ๋ค๋ฅธ A[l]์ B[r]์ ์กฐํฉ์ผ๋ก T๋ฅผ ์ฐพ๊ธฐ ์ํด์ sum์ A[l] + B[r]๋ก ๊ฐฑ์ ์์ผ์ฃผ๊ณ ๋ฐ๋ณต๋ฌธ์ ๊ณ์ํ๋ค.
- ๋ฐ๋ณต๋ฌธ์ ๋๊ฐ๊ณ ๋ ํ 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 |
'๐ฅ PS(Problem Solving) ๐ฅ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] #1208 ๋ถ๋ถ์์ด์ ํฉ 2 (0) | 2021.02.04 |
---|---|
[BOJ] #12100 2048 (0) | 2020.09.18 |
[BOJ] #15831 ์คํ์ ์กฐ์ฝ๋ (0) | 2020.08.19 |
[BOJ] #3366 ์์ด ์ค์ด๊ธฐ (0) | 2020.07.16 |
[BOJ] #17090 ๋ฏธ๋ก ํ์ถํ๊ธฐ (0) | 2020.07.16 |
๋๊ธ