canuc80k0910·11/50

Bao Nhiêu Giá Trị?

Nộp bài trên LQDOJ

Bài 09 · C++ STL

Cho một dãy gồm số nguyên. Hai phần tử có thể nằm ở các vị trí khác nhau nhưng vẫn được xem là cùng một giá trị nếu chúng bằng nhau.

Hãy đếm số giá trị khác nhau xuất hiện ít nhất một lần trong dãy.

Input

  • Dòng đầu chứa số nguyên .
  • Dòng thứ hai chứa số nguyên .

Output

  • In một số nguyên là số lượng giá trị phân biệt trong dãy.

Constraints

  • .
  • .

Scoring

  • Subtask ( số điểm): .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

8
5 2 5 7 2 9 9 1

Output

5

Giải thích: Dãy chứa đúng năm giá trị khác nhau là ; các lần xuất hiện lặp lại của và không được đếm thêm.

Lời giải tóm tắt
  • Phân tích: Điều cần lưu không phải số lần xuất hiện của từng giá trị mà chỉ là tập các giá trị đã gặp. set tự bỏ qua bản sao của một khóa, nên thao tác chèn mô tả đúng trực tiếp yêu cầu bài toán.
  • Thuật toán: Khởi tạo một set<long long>. Đọc lần lượt từng phần tử và chèn vào set. Sau khi đọc đủ n phần tử, in size() của set.
  • Chứng minh tính đúng đắn: Sau khi xử lý một tiền tố bất kỳ, set chứa đúng mọi giá trị đã xuất hiện trong tiền tố đó: giá trị mới được thêm vào, còn giá trị lặp lại không tạo bản sao. Bất biến đúng với tiền tố rỗng và được bảo toàn sau mỗi lần chèn. Vì vậy, khi đã xử lý toàn bộ dãy, kích thước set chính là số giá trị phân biệt cần tìm.
  • Độ phức tạp: Có n lần chèn, mỗi lần O(log n). Tổng thời gian O(n log n), bộ nhớ O(n).