Đếm cặp đôi (HSG'20)

Xem PDF

Điểm: 1500 (p) Thời gian: 1.0s Bộ nhớ: 977M Input: bàn phím Output: màn hình

Cho dãy số \(A\) gồm \(n\) phần tử nguyên dương \(A_1,A_2,…,A_n\). Mỗi phần tử có giá trị không vượt quá \(10^9\)\(n≤ 10^5\). Một cặp số được gọi là cặp tương đồng với \(x\), nếu cặp số này có tổng bằng số \(x\) cho trước nào đó.

Yêu cầu: Hãy đếm xem trong dãy số \(A\) có bao nhiêu cặp số (\(A_i;A_j\)) tương đồng với \(x\) (có nghĩa là \(A_i+ A_j=x\)) với \(i<j\).

Input

  • Dòng đầu tiên chứa dãy số \(n,x\) (\(n≤10^5,x≤10^6\)).
  • Dòng thứ 2 chứa \(n\) phần tử của dãy số \(A\) (\(A_i≤10^9\)).

Output

  • Ghi ra một số nguyên là cặp đôi tương đồng của dãy số.

Example

Test 1

Input
7 6
1 2 4 3 4 5 3 
Output
4

Bình luận


  • 0
    loctagia    10:05 a.m. 29 Tháng 11, 2024

    include <bits/stdc++.h>

    using namespace std;

    int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n, k, x;
    cin >> n >> k;
    map <int, int> a;
    int c = 0;
    for (int i = 0; i < n; ++i) {
    cin >> x;
    c += a[k - x];
    ++a[x];
    }
    cout << c;
    return 0;
    }


    • -5
      SBD20_Caominhduc    2:47 p.m. 1 Tháng 10, 2024 chỉnh sửa 3

      Bình luận bị ẩn vì nhiều phản hồi tiêu cực. Nhấp vào đây để mở.


      • 0
        PY1APhanGiaHung    5:54 p.m. 21 Tháng 9, 2024

        n, x = map(int, input().split())
        a = list(map(int, input().split()))
        c = {}
        ans = 0
        for p in a:
        tab q = x - p
        tab if q in c:
        tab ans += c[q]
        tab if p in c:
        2tab c[p] += 1
        tap else:
        2tab c[p] = 1
        print(ans)


        • 1
          tk22NguyenHuyPhuc    10:27 p.m. 7 Tháng 8, 2024

          def count_pairs(n, x, A):
          count = 0
          frequency = {}

          for num in A:
              target = x - num
              if target in frequency:
                  count += frequency[target]
          
              if num in frequency:
                  frequency[num] += 1
              else:
                  frequency[num] = 1
          
          return count
          

          n, x = map(int, input().split())
          A = list(map(int, input().split()))

          result = count_pairs(n, x, A)
          print(result)


          • 0
            anhduc11092014    9:47 a.m. 30 Tháng 7, 2024

            n,x = list(map(int, input().split()))
            a = list(map(int, input().split()))
            c = {}
            ans = 0
            for p in a:
            q = x-p
            if q in c:
            ans = ans+c[q]
            if p in c:
            c[p] = c[p]+1
            else:
            c[p] = 1
            print(ans)


            • 0
              Đăng_Khoa    10:37 a.m. 22 Tháng 7, 2024

              n, x = map(int, input().split())
              a = list(map(int, input().split()))
              d = {}
              for i in a:
              if i in d:
              d[i] += 1
              else:
              d[i] = 1
              t = 0
              for i in a:
              kq = x - i
              if kq in d:
              t += d[kq]
              t //= 2
              print(t)


              • -2
                TK22NguyenPhat    10:18 p.m. 23 Tháng 5, 2024 đã chỉnh sửa
                
                

                • -6
                  PY1CLeDongQuan    11:52 a.m. 29 Tháng 4, 2024

                  Bình luận bị ẩn vì nhiều phản hồi tiêu cực. Nhấp vào đây để mở.


                  • 0
                    thinhec12012007    9:51 p.m. 24 Tháng 4, 2024

                    Mọi người có thể tham khảo code :

                    include <bits/stdc++.h>

                    using namespace std;
                    map<int,int>mp;

                    define ll long long

                    int n,k,x;
                    ll res=0;
                    int main() {
                    ios_base::sync_with_stdio(0);
                    cin.tie(0);cout.tie(0);
                    cin>>n>>k;
                    int tam;
                    for(int i=1;i<=n;i++) {
                    cin>>x;
                    mp[x]++;
                    tam=k-x;
                    if(k-x!=x)
                    res+=mp[k-x];

                    }
                    ll gan=mp[k/2];
                    if(gan>=2) gan--;
                    else gan=0;
                    
                    cout<<res+(gan*(gan+1)/2);
                    return 0;
                    

                    }


                    • 4
                      thinhec12012007    9:51 p.m. 24 Tháng 4, 2024

                      Đây là cách giải của mình, bạn nào có thắc mắc hay câu hỏi nào thì có thể hỏi mình ạ
                      7 6
                      1 2 4 3 4 5 3

                      Các cặp số thỏa mãn tổng bằng 6 :
                      1-5
                      2-4
                      2-4
                      3-3

                      Ta sẽ dùng map để giải bài này : Đầu tiên ta sẽ đếm số lần xuất hiện của các phần tử , sau đó cộng số lần xuất hiện của phần tử thỏa mãn : tổng của phần tử đó cộng một phần tử khác bằng k.
                      Ở đây mình sẽ dùng biến đếm tên là res :
                      Thì số cặp sẽ thỏa mãn : res+=mp[k-x]; (với x lần lượt là các phần tử trong mảng) .
                      Ta có tính chất như sau : một số nào đó + với số x bằng k :
                      Thì số đó sẽ có giá trị là : k-x.
                      Như vậy ta chỉ cần đếm sự xuất hiện của số k-x nào đó trong mảng là sẽ đếm được số cặp có tổng là k
                      Lưu ý ta sẽ không cộng vào phần tử có giá trị là : k/2 vội , vì cộng như vậy ta sẽ bị cộng lặp kết quả trước đó .
                      Vì phần tử k/2 là trường hợp đặc biệt nên ta sẽ chia làm 2 trường hợp :
                      Nếu phần tử k/2 xuất hiện lớn hơn hoặc bằng 2 lần trong mảng thì ta
                      Sẽ có số cặp thỏa mãn là : tổng từ 1 đến k/2-1 số lần xuất hiện của phần tử k/2 đó
                      Vd : 4 4 4 4 và tổng cần tìm là 8
                      Thì ta sẽ có số cặp thỏa mãn là : 6 => tương đương tổng từ 1 đến 3 là 6
                      Ngược lại nếu không có giá trị nào bằng k/2 trong mảng thì ta không cần cộng vào :
                       Và kết quả cuối cùng là kết quả của : số cặp có giá trị là k/2 và res.

                      • 7 bình luận nữa