Hướng dẫn cho Tìm kiếm ID hợp lệ


Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.

Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.

Authors: lastcreate

Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.

Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.

💡 Gợi ý giải bài "Tìm kiếm ID hợp lệ"

1. Hướng tiếp cận (Mô phỏng)

  • Duyệt qua từng ID bài nộp từ đầu đến cuối theo đúng thứ tự thời gian.
  • Khởi tạo biến lưu kết quả: lastcreate = 0.

2. Cấu trúc dữ liệu phù hợp

  • Vì ID có giá trị rất lớn (lên tới \(10^9\)), bạn không thể dùng mảng đánh dấu (bool hoặc int) thông thường vì sẽ bị tràn bộ nhớ.
  • Giải pháp: Sử dụng cấu trúc dữ liệu Tập hợp (Set) để lưu trữ các ID đã xuất hiện. Tập hợp giúp kiểm tra một phần tử đã tồn tại hay chưa với độ phức tạp cực nhanh (\(O(1)\) hoặc \(O(\log N)\)).
  • C++: std::set hoặc std::unordered_set
  • Python: set()

3. Thuật toán xử lý từng bước

Với mỗi ID \(A_i\) trong danh sách, ta kiểm tra:

  1. Điều kiện cập nhật: Nếu \(A_i > \text{lastcreate}\) VÀ \(A_i\) chưa có trong tập hợp da_xuat_hien.
  2. Hành động: * Cập nhật lastcreate = A_i.
  3. Đánh dấu: Luôn thêm \(A_i\) vào tập hợp da_xuat_hien sau khi kiểm tra (dù có được cập nhật hay không).

4. Lưu ý quan trọng

  • Đọc/Ghi file: Đừng quên cấu hình đọc từ file tkidhl.inp và ghi ra file tkidhl.out theo yêu cầu đề bài.
  • Kiểu dữ liệu: Sử dụng kiểu số nguyên lớn (long long trong C++) cho các ID để tránh lỗi tràn số.
C++
#include <iostream>
#include <set>
#include <cstdio>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    freopen("tkidhl.inp", "r", stdin);
    freopen("tkidhl.out", "w", stdout);

    int n;
    if (!(cin >> n)) return 0;

    set<long long> s;
    long long ans = 0;

    for (int i = 0; i < n; ++i) {
        long long x;
        cin >> x;
        if (x > ans && !s.count(x)) {
            ans = x;
        }
        s.insert(x);
    }

    cout << ans << "\n";

    return 0;
}

Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.