Link
https://www.acmicpc.net/problem/2015
Detail
누적합까지의 아이디어는 (여러개의 부분합을 구해야 함 + 배열의 순서가 변경되지 않음) 을 통해서 빠르게 생각해낼 수 있었다.
다만 배열의 최대 갯수가 20만이기 때문에 ( 이 등장하는 단골 수) 누적합을 구성해두었다고 부분합이 K인 것들의 갯수가 몇개인지 으로 구할 수 는 없다.
이 과정에서 고민을 하다가. 2시간이 오버되어 검색으로 해답을 알 수 있었다.
- 까지의 합을 set에 저장한다.
- 의 부분합이 k인 i, j를 구할려면
- 각 i마다 올바른 j를 set에서 찾는다
로 시간 복잡도를 달성할 수 있다.
Code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
int n, k;
cin >> n >> k;
vector<int> preSum(n);
map<int, ll> sumFreq;
sumFreq[0] = 1;
int num;
for (int i = 0; i < n; i++) {
cin >> num;
if (i == 0) {
preSum[i] = num;
} else {
preSum[i] = preSum[i - 1] + num;
}
}
ll ans = 0;
for (int i = 0; i < n; i++) {
if (sumFreq.find(preSum[i] - k) != sumFreq.end()) {
ans += sumFreq[preSum[i] - k];
}
sumFreq[preSum[i]]++;
}
cout << ans << endl;
}