trang chủ / bài tập / xortree47

Cây XOR

Đề bài

Mô tả

Cho một dãy gồm k số nguyên không âm đôi một phân biệt (b1,b2,,bk). Ta xây dựng một đồ thị vô hướng k đỉnh, đỉnh thứ i mang giá trị bi, theo quy tắc sau:

  • Với mỗi i từ 1 đến k, tìm chỉ số j (ji) sao cho giá trị bibj là nhỏ nhất trong tất cả các lựa chọn của j (ở đây là phép XOR theo bit). Thêm một cạnh vô hướng nối đỉnh bi và đỉnh bj.

Nếu một cạnh bị thêm hai lần thì nó chỉ được tính một lần. Dãy được gọi là tốt nếu và chỉ nếu đồ thị thu được là một cây (liên thông và không có chu trình đơn).

Cho dãy (a1,a2,,an) gồm n số nguyên không âm đôi một phân biệt. Bạn được phép xoá đi một số phần tử (có thể không xoá phần tử nào) để dãy còn lại trở thành dãy tốt. Hãy tìm số phần tử ít nhất cần xoá.

Có thể chứng minh rằng với mọi dãy, luôn tồn tại cách xoá để dãy còn lại có ít nhất 2 phần tử và là dãy tốt.

Dữ liệu vào

  • Dòng đầu chứa số nguyên n — độ dài của dãy.
  • Dòng thứ hai chứa n số nguyên phân biệt a1,a2,,an.

Dữ liệu ra

  • In ra một số nguyên duy nhất — số phần tử ít nhất cần xoá để dãy còn lại là dãy tốt.

Ràng buộc

  • 2n200000
  • 0ai109
  • Các ai đôi một phân biệt.

Ví dụ

Input Output Giải thích
5
0 1 5 2 6
1 Dãy (0,1,5,2,6) không tốt vì không thể đi từ 1 đến 5 trên đồ thị. Xoá phần tử 6, dãy còn lại (0,1,5,2) là dãy tốt.
7
6 9 8 7 3 5 2
2 Cần xoá ít nhất 2 phần tử để phần còn lại tạo thành cây.

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 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