I was doing this problem for practice. Here is my initial solution:
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int n, x;
cin >> n >> x;
unordered_map<ll, int> cnt;
ll sum = 0;
ll res = 0;
cnt[0] = 1;
while(n --) {
int a;
cin >> a;
sum += a;
res += cnt[sum - x];
cnt[sum] ++;
}
cout << res;
}
The solution is pretty simple, using a prefix sum and for each element check how many times the complement number occurred before. Here, I use unordered_map
in order to count the frequency of each element, as a regular bitmap would be far too large. However, when submitting this I got time limit exceeded on a few test cases. I was stumped for a long time, so I had to look at the solution. The solution was very similar to mine, but there was a difference in that they used map
while I use unordered_map
. So I changed which map I used, and when submitting again it got accepted. I am curious as to why using a map
is faster than unordered_map
in this situation, as I thought map
was slower due to it's nature of sorting all elements coming in.