Computer >> Máy Tính >  >> Lập trình >> C ++

Truy vấn để kiểm tra xem một số có nằm trong N dãy L-R trong C ++ hay không

Trong bài toán này, chúng ta có N dãy [L, R] và Q truy vấn, mỗi truy vấn chứa một số val. Nhiệm vụ của chúng ta là tạo một chương trình giải các Truy vấn để kiểm tra xem một số có nằm trong N dãy L-R trong C ++ hay không.

Mô tả vấn đề

Chúng ta được cung cấp cho N dãy kiểu [L, R] chứa các giá trị lớn hơn từ L đến R, ví dụ, dãy [3, 6] chứa 3,4,5,6. Bất cứ truy vấn nào, chúng tôi đều nhận được một giá trị, mà sự hiện diện của nó sẽ được kiểm tra. Chương trình sẽ trả về true nếu giá trị có trong bất kỳ một trong các phạm vi, ngược lại, nó sẽ trả về false.

Hãy lấy một ví dụ để hiểu vấn đề,

Đầu vào :range [N] ={{2, 4}, {6,7}, {9, 12}}

Q =3

Truy vấn ={1, 7, 10}

Đầu ra :Không có mặt

Hiện tại

Hiện tại

Giải thích

Đối với truy vấn 1:số 1 không có trong bất kỳ phạm vi nào.

Đối với truy vấn 2:số 7 có trong phạm vi {6, 7}.

Đối với truy vấn 1:số 10 có trong phạm vi {9, 12}.

Phương pháp tiếp cận giải pháp

Chúng ta cần kiểm tra xem giá trị có ở bất kỳ phạm vi nào hay không, vì vậy chúng ta cần kiểm tra xem giá trị đó có tương ứng với tất cả các phạm vi hay không. Đối với điều này, chúng tôi sẽ sử dụng một bản đồ băm. Việc sắp xếp L và R của phạm vi một cách riêng biệt và sau đó tìm kiếm bằng các thuật toán tìm kiếm nhị phân sẽ dễ dàng đưa ra giải pháp.

Ví dụ

#include <bits/stdc++.h>
using namespace std;
vector<int> v;
unordered_map<int, int> mpp;
void initialiseMap(int a[][2], int n){
   for (int i = 0; i < n; i++) {
      v.push_back(a[i][0]);
      mpp[a[i][0]] = 1;
      v.push_back(a[i][1]);
      mpp[a[i][1]] = 2;
   }
   sort(v.begin(), v.end());
}
bool isElementPresent(int val) {
   int ind = lower_bound(v.begin(), v.end(), val) - v.begin();
   if (v[ind] == val)
      return true;
   else {
      if (mpp[v[ind]] == 2)
         return true;
      else
         return false;
   }
}
int main(){
   int arr[][2] = {{2, 4}, {6,7}, {9, 12}};
   int n = 3;
   int Q = 3;
   int query[] = { 1, 7, 10 };
   initialiseMap(arr, n);
   for(int i = 0; i < Q; i++){
      cout<<"For Query "<<(i+1);
      if(isElementPresent(query[i]))
         cout<<": The given digit "<<query[i]<<" is present in one of the given ranges\n";
      else
         cout<<": The given digit "<<query[i]<<" is not present in any of the given ranges\n";
   }
   return 0;
}

Đầu ra

For Query 1: The given digit 1 is not present in any of the given ranges
For Query 2: The given digit 7 is present in one of the given ranges
For Query 3: The given digit 10 is present in one of the given ranges