trang chủ / bài tập / majopn24 / lời giải

Ý Kiến Đa Số

Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
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.
Tác giả: huunguyenhuunguyen

Hướng tiếp cận

Câu hỏi cốt lõi: với một loại cỏ v cố định, khi nào ta có thể "lan" v 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 2 con bò cùng thích v, thì ta luôn lan được. Thật vậy, giả sử hi=hi+1=v. Lấy nhóm {i1,i,i+1}: trong nhóm này v chiếm 2/3>1/2, nên cả ba con đều chuyển sang v. 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ị v hay không.

Nhận xét quan trọng

Loại v hợp lệ khi và chỉ khi tồn tại i sao cho hi=hi+1=v hoặc hi=hi+2=v.

Chiều thuận (đủ).

  • Trường hợp hi=hi+1=v: đã có cặp liên tiếp, áp dụng quan sát trên.
  • Trường hợp hi=hi+2=v (với hi+1 tùy ý): nhóm {i,i+1,i+2} có hai con thích v 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 v, 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 i nào để hi=hi+1=v hay hi=hi+2=v. Khi đó hai vị trí bất kỳ thích v cách nhau tối thiểu 3. Xét bất kỳ đoạn liên tiếp độ dài L: số con thích v trong đoạn không vượt quá L/3, luôn L/2 (với L2). Vậy v 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, và không thể tạo ra hai con thích v liên tiếp. Số con thích v 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

  1. Đọc dãy h1,,hn.
  2. Khởi tạo tập S=.
  3. Với i=1,,n1: nếu hi=hi+1, thêm hi vào S.
  4. Với i=1,,n2: nếu hi=hi+2, thêm hi vào S.
  5. Nếu S rỗng in -1; ngược lại in các phần tử của S 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 n/2 — đó 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: O(NlogN) nếu dùng set, O(N) nếu dùng mảng đánh dấu.
  • Bộ nhớ: O(N).

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.46 awk 1.3.4 gcc 16.1.0 csc 6.12.0.200 g++ 16.1.0 g++-themis 16.1.0 g++17 16.1.0 g++20 16.1.0 g++23 16.1.0 clang++ 22.1.6 dmd 2.112.0 dart 3.12.1 gforth 0.7.3 gfortran 12.2.0 go 1.26.3 groovyc 5.0.6 javac 25.0.3 node 26.2.0 kotlinc 2.3.21 sbcl 2.2.9 lua 5.4.8 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.6 pike 8.0 pypy3 7.3.23 python3 3.14.5 racket 8.7 ruby 4.0.5 rustc 1.96.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 tclsh 8.6 bun 1.3.14 deno 2.8.1 v 0.5.1 zig 0.16.0