Hướng giải của Đoạn giá trị trùng nhau
Nhớ rằng hướng dẫn giải này chỉ nên sử dụng khi bế tắc, và tuyệt đối không nên sao chép mã nguồn kèm theo. Hãy tôn trọng tác giả bài tập và người viết hướng dẫn giải.
Nộp mã nguồn lời giải chính thức trước khi giải bài tập đó có thể khiến bạn bị ban.
Nộp mã nguồn lời giải chính thức trước khi giải bài tập đó có thể khiến bạn bị ban.
Tác giả:
Để tìm vị trí đầu tiên và cuối cùng của một phần tử trong mảng đã sắp xếp:
- Vị trí đầu tiên: là vị trí đầu tiên \(\ge X\). Trong C++ sử dụng
lower_bound, trong Python sử dụngbisect_left. - Vị trí cuối cùng: là vị trí lớn nhất \(\le X\). Hoặc ta có thể tìm vị trí đầu tiên \(> X\) (bằng
upper_boundtrong C++ hoặcbisect_righttrong Python) rồi trừ đi 1.
Kiểm tra nếu phần tử đầu tiên tìm được không bằng \(X\) hoặc vượt quá mảng thì kết luận không tìm thấy.
Độ phức tạp: \(O(\log N)\).
Xem code mẫu C++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n;
long long x;
if (!(cin >> n >> x)) return 0;
vector<long long> a(n);
for (int i = 0; i < n; ++i) cin >> a[i];
auto first_it = lower_bound(a.begin(), a.end(), x);
if (first_it == a.end() || *first_it != x) {
cout << "-1 -1\n";
} else {
auto last_it = upper_bound(a.begin(), a.end(), x) - 1;
int first_pos = first_it - a.begin() + 1;
int last_pos = last_it - a.begin() + 1;
cout << first_pos << " " << last_pos << "\n";
}
return 0;
}
Nhận xét