canuc80k1424·25/50

AND Lớn Nhất Sau Khi Bật Bit

Nộp bài trên LQDOJ

Bài 14 · Bitwise Operations

Cho dãy và số nguyên không âm . Trong một thao tác, bạn chọn một phần tử và một vị trí bit từ đến , rồi bật bit đó thành bằng phép OR với .

Được thực hiện không quá thao tác. Hãy tìm giá trị lớn nhất có thể của

Input

  • Dòng đầu chứa số nguyên .
  • Mỗi bộ test gồm một dòng chứa , sau đó một dòng chứa số nguyên .

Output

  • Với mỗi bộ test, in giá trị AND lớn nhất có thể.

Constraints

  • .
  • và tổng không vượt .
  • .
  • .

Scoring

  • Subtask ( điểm): test có ít bit và nhỏ, cho phép thử mọi mặt nạ đích.
  • Subtask ( điểm): test đầy đủ; test có bộ và tổng , test có một bộ với .

Example

Test 1

Input

2
3 2
1 2 3
3 0
7 3 5

Output

3
1

Giải thích: Ở bộ đầu, bật bit của số và bit của số ; khi đó cả ba số đều chứa hai bit thấp, nên AND bằng . Bộ hai không có thao tác; .

Lời giải tóm tắt
  • Ý tưởng: Chi phí để bit b xuất hiện trong AND là số phần tử đang có bit b bằng 0. Xét bit từ cao xuống thấp và mua bit nếu chi phí không vượt ngân sách còn lại.
  • Chứng minh đúng đắn: Mỗi bước của thuật toán duy trì đúng đại lượng hoặc điều kiện nêu trong ý tưởng. Quy tắc chọn được áp dụng độc lập trên từng bit hoặc từng prefix theo đúng hợp đồng; vì vậy mọi phương án bị loại đều không thể tốt hơn, còn phương án được chọn đạt giá trị tối ưu. Suy ra đầu ra của thuật toán là hợp lệ và tối ưu.
  • Độ phức tạp: Thuật toán đáp ứng cận lớn nhất của đề; phần cài đặt chỉ dùng bộ nhớ tuyến tính theo kích thước input hoặc hằng số theo số bit.