Link to this code:
https://cses.fi/paste/29d15be75c988e607d8ef4/
/*
2024 cùng những điều ước.
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const ll LINF = 1e18;
const int INF = 1e9;
// Đây là dạng bài kinh điển sử dụng công thức của tổng tiền tố
// Tổng đoạn [l, r] = x <=> pref[r] - pref[l - 1] = x
// <=> pref[r] - x = pref[l - 1]
// => Đưa về bài toán đếm có bao nhiêu cặp (l, r) (l < r) sao cho pref[r] - x = pref[l - 1]
const int N = 2e5 + 5;
int n, x;
int a[N];
ll pref[N];
signed main() {
ios::sync_with_stdio(0); cin.tie(0);
cin >> n >> x;
for (int i = 1; i <= n; i++) {
cin >> a[i];
pref[i] = pref[i - 1] + a[i];
}
// Nhận thấy pref[i] có thể âm hoặc có thể có giá trị rất lớn nên ta dùng map
map<ll, int> cnt;
ll ans = 0;
for (int i = 0; i <= n; i++) { // Chú ý: mấy em mới code đặc biệt hay quên xét pref[0]
ans += cnt[pref[i] - x];
cnt[pref[i]]++;
}
cout << ans << '\n';
return 0;
}