๋ฌธ์
A[1], A[2], ..., A[N]์ N๊ฐ์ ์ ์๊ฐ ์ ์ฅ๋์ด ์๋ ๋ฐฐ์ด์ด ์๋ค. ์ด ๋ฐฐ์ด A์ ๋ถ๋ถํฉ์ด๋ 1 ≤ i ≤ j ≤ N์ธ ์ ์ i์ j์ ๋ํด A[i]๋ถํฐ A[j]๊น์ง์ ํฉ์ ๋งํ๋ค.
N๊ณผ A[1], A[2], ..., A[N]์ด ์ฃผ์ด์ก์ ๋, ์ด๋ฌํ N×(N+1)/2๊ฐ์ ๋ถ๋ถํฉ ์ค ํฉ์ด K์ธ ๊ฒ์ด ๋ช ๊ฐ๋ ์๋์ง๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ ์ N๊ณผ K๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ N ≤ 200,000, |K| ≤ 2,000,000,000) N๊ณผ K ์ฌ์ด์๋ ๋น์นธ์ด ํ๋ ์๋ค. ๋์งธ ์ค์๋ ๋ฐฐ์ด A๋ฅผ ์ด๋ฃจ๋ N๊ฐ์ ์ ์๊ฐ ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ A[1], A[2], ..., A[N]์ ์์๋ก ์ฃผ์ด์ง๋ค. ์ฃผ์ด์ง๋ ์ ์์ ์ ๋๊ฐ์ 10,000์ ๋์ง ์๋๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ํฉ์ด K์ธ ๋ถ๋ถํฉ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
ํ์ด
01. ์ผ๋จ ์๋ฃํ์ ์ ์ํ์.
- ๋ถ๋ถํฉ ๊ฐ์์ ์ต๋๊ฐ์ด 2,000,000,000 * (2,000,000,000 + 1) / 2 ์ด๋ฏ๋ก long long์ ์ฌ์ฉํด์ผ ํ๋ค.
- ๊ฒฐ๊ณผ๊ฐ์ ์ต๋๊ฐ์ ๋ถ๋ถํฉ ๊ฐ์์ ์ต๋๊ฐ๊ณผ ๊ฐ์ผ๋ฏ๋ก ์ญ์ long long์ ์ฌ์ฉํ๋ค.
02. ๊ฐ๊ฐ์ ๋ถ๋ถํฉ์ ์ ์ฅํ๋ค(p_sum)
03. 1~n๊น์ง i๋ฅผ ๋๋ฉด์ sum[i] - sum[j] = k๋ฅผ ๋ง์กฑํ๋ j๊ฐ ์๋์ง ๊ฒ์ฌํ๋ค.
๋ฌธ์ ์์๋ 1<i<j<n์ผ๋ก ๋์ด์์ง๋ง ํ์ด ๊ณผ์ ์์๋ i๋ j๋ฅผ ๊ตฌ๋ถํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ (1<j<i<n)์ผ๋ก ๋ฐ๊ฟ์ผ๋ค.
- sum[j] = sum[i] - k
04. sum[i]๊ฐ์ map์ ๋ฃ์ด์ค๋ค.
- map์ ๋ถ๋ถํฉ์ ๋น๋๋ฅผ ์ ์ฅํ๋ค. (key : ๋ถ๋ถํฉ, value : ๋น๋)
- ๋ง์ฝ sum[j]๊ฐ map์ ์กด์ฌํ๋ฉด ans๋ฅผ ์ฆ๊ฐ์์ผ์ค๋ค.
- p_sum[i]๊ฐ k์ธ ๊ฒฝ์ฐ, j๊ฐ 0์ด ๋ ์ ์๊ธฐ ๋๋ฌธ์ map[0] = 1์ ํ์ํด์ค๋ค.
#include <iostream>
#include <map>
using namespace std;
int p_sum[200001];
int main(){
int n, k, num;
cin >> n >> k;
map<int, long long> m; // ๋ถ๋ถํฉ ๊ฐ์ : 2000000000*(2000000000+1)/2
long long cnt = 0;
m[0] = 1; // p_sum[i]๊ฐ k์ธ ๊ฒฝ์ฐ, j=0์ด ๋ ์ ์์
for (int i=1; i<=n; i++){
cin >> num;
// 01. ๊ฐ๊ฐ์ ๋ถ๋ถํฉ์ ์ ์ฅ
p_sum[i] = p_sum[i-1] + num;
// * 1~n๊น์ง i๋ฅผ ๋๋ฉด์ sum[i] - sum[j] = k๋ฅผ ๋ง์กฑํ๋ j๊ฐ ์๋์ง ๊ฒ์ฌ(i>=j๋ผ๊ณ ๊ฐ์ ! - ๋ฌธ์ ์ ๊ธฐํธ ๋ค๋ฅด๊ฒ ์จ๋ ์๊ดX)
// ๋ง์ฝ ์กด์ฌํ๋ฉด ans++;
// sum[j] = sum[i] - k
cnt += m[p_sum[i] - k];
// 02. map์ ์ ์ฅ
m[p_sum[i]]++;
}
cout << cnt;
}
์ด ๋ฌธ์ ๋ ์ดํด๋ฅผ ๋ชปํด์ ๋๋ฌด ์ด๋ ค์ ๋ค. ํนํ ๋ค ํ์๋๋ฐ p_sum[i]๊ฐ k์ธ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ์ง ๋ชปํด์ ์๊พธ ์๋ฌ๊ฐ ๋ฌ๋ค.
'โจ Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/C++] 9375๋ฒ : ํจ์ ์ ์ ํ๋น (0) | 2021.09.12 |
---|---|
[๋ฐฑ์ค/C++] 4358๋ฒ : ์ํํ (0) | 2021.09.12 |
[๋ฐฑ์ค/C++] 1764๋ฒ : ๋ฃ๋ณด์ก (0) | 2021.09.12 |
[๋ฐฑ์ค/C++] 10757๋ฒ : ํฐ ์ (0) | 2021.09.12 |
[๋ฐฑ์ค/C++] 19636๋ฒ : ์์ ์๋ฎฌ๋ ์ด์ (0) | 2021.09.12 |
๋๊ธ