[Mảng 1 Chiều Cơ Bản]. Bài 44. Dãy con chẵn lẻ

Xem dạng PDF

Gửi bài giải

Điểm: 1,00 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M
Input: stdin
Output: stdout

Tác giả:
Nguồn bài:
28Tech
Dạng bài
Ngôn ngữ cho phép
C, C#, C++, Java, Kotlin, Pascal, PyPy, Python, Scratch

Cho mảng A[] gồm N phần tử, bạn hãy đếm số lượng dãy con liên tiếp mà số lượng số chẵn bằng số lượng số lẻ.


Đầu vào

Dòng 1 là N : số phần tử trong mảng

Dòng 2 là N phần tử cách nhau 1 khoảng trắng


Giới hạn

1<=N<=1000

0<=A[i]<=1000


Đầu ra

In ra đáp án của bài toán


Ví dụ :

Input 01
7
3 2 1 6 4 0 0
Output 01
4
Giải thích :

Các dãy con thỏa mãn {3, 2}, {3, 2, 1, 6}, {1, 6}, {2, 1}


Bình luận

Hãy đọc nội quy trước khi bình luận.



  • 0
    bengokyeuanh99  đã bình luận lúc 1, Tháng 5, 2025, 20:09

    include <bits/stdc++.h>

    using namespace std;

    using ll = long long;

    ll countBalancedSubarrays(const vector<int>& arr) { unordered_map<int, int> freq; freq[0] = 1;

    int prefixSum = 0;
    ll count = 0;
    
    for (int x : arr) {
        prefixSum += (x % 2 == 0 ? 1 : -1);
        count += freq[prefixSum];
        freq[prefixSum]++;
    }
    
    return count;
    

    }

    int main() { iosbase::syncwith_stdio(false); cin.tie(nullptr);

    int n;
    cin >> n;
    
    vector<int> a(n);
    for (int& x : a) cin >> x;
    
    cout << countBalancedSubarrays(a) << '\n';
    return 0;
    

    }


  • -5
    VDev  đã bình luận lúc 27, Tháng 2, 2025, 10:00

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • 0
    knight01  đã bình luận lúc 6, Tháng 2, 2025, 20:06 sửa 2

    include <iostream>

    #include <numeric>
    using namespace std;
    bool check(int a[], int n, int i, int j) {
        int evenCnt = 0, oddCnt = 0;
        for (int k = i; k <= j; k++) {
            if (a[k] % 2 == 0) evenCnt++;
            else oddCnt++;
        }
        return evenCnt == oddCnt;
    }
    
    int main() {
        int n; cin >> n;
        int a[n];
        for (int i = 0; i < n; i++) cin >> a[i];
        int cnt = 0;
        for (int i = 0; i < n; ++i) {
            for (int j = i; j < n; ++j) {
                if (check(a, n, i, j)) cnt++;
            }
        }
        cout << cnt;
    }
    

  • -2
    duongpvd12044  đã bình luận lúc 24, Tháng 9, 2024, 17:41

    ae tham khảo ^_^

    include<bits/stdc++.h>

    using namespace std;
    int main() { map mp; long long tong=0; int dem=0; mp[0].pushback(1); int n;cin>>n; for(int i=0;i<n;i++) { int x;cin>>x; if(x%2==0) tong=tong+1; else tong=tong-1; if(mp.count(tong)!=0)
    { dem=dem+mp[tong].size(); mp[tong].push
    back(i); } else mp[tong].push_back(i); } cout<<dem; }


  • -1
    Nguyen_Van_Tien_ccp012  đã bình luận lúc 26, Tháng 8, 2024, 7:32

    include <iostream>

    include <math.h>

    include <set>

    include <map>

    include <bits/stdc++.h>

    using namespace std; long long gt(int n) { long long sum = 0; for (int i = 0;i <= n;i++) sum += i; return sum; } int main() { int n;cin >> n; int a[n]; for (int i = 0;i < n;i++) cin >> a[i]; int tong = 0; long long demt = 0; map <int,int> mp; for (int i = 0;i < n;i++) { if (a[i] % 2 == 0) a[i] = 1; else a[i] = -1; } for (int i = 0;i < n;i++) { tong += a[i]; mp[tong]++; } for (auto it : mp) { if (it.first == 0) demt += gt(it.second); else { demt += gt(it.second - 1); } } cout << demt << endl; }


    • 4
      duy210  đã bình luận lúc 20, Tháng 9, 2024, 11:13

      anh giải thích ý tưởng code của anh được không :((


      • 0
        Tunganh9CT  đã bình luận lúc 1, Tháng 5, 2025, 17:15
        1. Biến đổi mảng Chuyển mỗi phần tử:

        Nếu là số chẵn, gán thành -1

        Nếu là số lẻ, gán thành +1

        Như vậy:

        Một dãy con có số lẻ = số chẵn ⇨ tổng của dãy con sau biến đổi sẽ bằng 0.

        1. Dùng prefix sum và hashmap đếm số dãy con có tổng bằng 0 Duyệt từ đầu đến cuối mảng, tính prefix_sum sau khi biến đổi.

        Dùng một map lưu số lần xuất hiện của mỗi prefix_sum.

        Nếu tại một thời điểm nào đó, tổng prefix_sum = x, thì số lần ta đã gặp x trước đó chính là số dãy con kết thúc tại vị trí hiện tại có tổng = 0.


  • -6
    TomGetsu  đã bình luận lúc 21, Tháng 8, 2024, 15:59

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • 0
    Lamlilac1234  đã bình luận lúc 11, Tháng 8, 2024, 15:18

    đề bài nói là dãy liên tiếp nhé, ae cẩn thận. tôi làm hết tất cả dãy con muốn sảng luôn mới biết.


  • -27
    phipham304  đã bình luận lúc 7, Tháng 4, 2024, 5:28 chỉnh sửa

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.