Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Hướng tiếp cận
Câu hỏi cốt lõi: với một loại cỏ cố định, khi nào ta có thể "lan" ra cả đàn?
Quan sát đầu tiên: nếu trong dãy đã tồn tại một đoạn liên tiếp gồm con bò cùng thích , thì ta luôn lan được. Thật vậy, giả sử . Lấy nhóm : trong nhóm này chiếm , nên cả ba con đều chuyển sang . Cứ thế mở rộng sang trái và sang phải, mỗi bước thêm một con bò, đến khi phủ toàn bộ dãy.
Vậy đủ để tìm xem có thể tạo ra một cặp liên tiếp cùng giá trị hay không.
Nhận xét quan trọng
Loại hợp lệ khi và chỉ khi tồn tại sao cho hoặc .
Chiều thuận (đủ).
- Trường hợp : đã có cặp liên tiếp, áp dụng quan sát trên.
- Trường hợp (với tùy ý): nhóm có hai con thích trên tổng ba con, chiếm đa số. Một thao tác duy nhất biến nhóm này thành ba con cùng thích , tạo ra cặp liên tiếp quay về trường hợp trên.
Chiều ngược (cần). Giả sử không tồn tại nào để hay . Khi đó hai vị trí bất kỳ thích cách nhau tối thiểu 3. Xét bất kỳ đoạn liên tiếp độ dài : số con thích trong đoạn không vượt quá , luôn (với ). Vậy không bao giờ là đa số tuyệt đối trong bất kỳ nhóm nào, không có thao tác nào sinh thêm con thích , và không thể tạo ra hai con thích liên tiếp. Số con thích chỉ có thể giảm hoặc giữ nguyên qua các thao tác, nên không thể phủ kín đàn.
Thuật toán
- Đọc dãy .
- Khởi tạo tập .
- Với : nếu , thêm vào .
- Với : nếu , thêm vào .
- Nếu rỗng in
-1; ngược lại in các phần tử của theo thứ tự tăng dần.
Lưu ý cài đặt: dùng set (đảm bảo sắp xếp và loại trùng) hoặc mảng đánh dấu kết hợp duyệt theo thứ tự giá trị. Tránh dùng map<int,int> đếm tần suất rồi so với — đó là tư duy "đa số toàn mảng", không đúng với bài này.
Độ phức tạp
- Thời gian: nếu dùng
set, nếu dùng mảng đánh dấu. - Bộ nhớ: .
Bình luận