Solutions of Subarray sum - MarisaOJ: Marisa Online Judge

Solutions of Subarray sum

Select solution language

Write solution here.


User Avatar Temrater    Created at    2 likes

## **Ý TƯỞNG:** Kích thước n <= 1e5, vì thế bạn không thể dùng vòng for lồng(1e5 x (1e5 - 1)) để duyệt. Ở bài này ta sử dụng kiến thức về **prefix_sum** và **map**. ### **Thành Phần:** **- prefix[]**: Mảng cộng dồn các phần tử từ i = 1 đến i = n. **- map[]**: Lưu số lần xuất hiện của `prefix[i]`. ### **Giải Thích:** Cần lưu ý như sau: $A + B = C$ <=> $B = C - A$ Nghĩa là tổng hoặc hiệu của 2 số (A,B) chỉ có thể suy ra duy nhất 1 đáp án là C. Do vậy lưu **prefix_sum** của mảng ban đầu, duyệt lại mảng **prefix_sum** 1 lần nữa và ***trong khi duyệt***: với mỗi vị trí `prefix[i]` đếm xem có bao nhiêu số có giá trị là `prefix[i]-x` (`x` là số đề bài cho). `mp[prefix[i]-x]` là số lượng số có giá trị `prefix[i]-x`, chính những số lượng số có giá trị `prefix[i]-x` này là các đoạn con liên tiếp mà tổng của đoạn con tại vị trí `prefix[i]` = `x` *(prefix[i] - (prefix[i]-x) = x)*. Cần lưu ý **trường hợp đặc biệt** rằng có thể `x` = 0, `prefix[i]` = 0. ```cpp #include <bits/stdc++.h> using namespace std; #define int long long int n, x, ans; int prefix[100005]; map<int, int> mp; signed main(){ cin >> n >> x; for (int i = 1; i <= n; i++) { int temp_one; cin >> temp_one; prefix[i] = prefix[i-1] + temp_one; mp[prefix[i]]++; ans += mp[prefix[i] - x]; if(prefix[i] == x && prefix[i] - x != prefix[i]) ans++; //Truong hop x = 0, prefix[i] = 0 } cout << ans; } // From member of Trấn Biên Highshool ```