canuc80k3026·27/50

Bước Nhảy Đổi Tính Chẵn Lẻ

Nộp bài trên LQDOJ

Bài 30 · DFS and BFS

Cho mảng số nguyên dương . Khi đang đứng ở vị trí , bạn có thể thực hiện một bước nhảy tới:

  • vị trí , nếu vị trí này vẫn thuộc đoạn ;
  • vị trí , nếu vị trí này vẫn thuộc đoạn .

Với từng vị trí bắt đầu , hãy tìm số bước ít nhất để tới một vị trí mà khác tính chẵn lẻ với . Nếu không tồn tại cách đi như vậy, kết quả của vị trí là .

Input

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

Output

  • In số nguyên. Số thứ là số bước ít nhất cần tìm cho vị trí , hoặc nếu không thể tới giá trị có tính chẵn lẻ đối lập.

Constraints

  • .
  • .

Scoring

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

Example

Test 1

Input

5
1 2 1 2 1

Output

1 -1 1 -1 1

Giải thích: Các vị trí đều nhảy một bước tới một giá trị chẵn. Từ vị trí hoặc , mọi vị trí có thể tới đều mang giá trị chẵn nên kết quả là .

Lời giải tóm tắt
  • Ý tưởng: Xem mỗi vị trí là một đỉnh. Từ i có nhiều nhất hai cạnh đi tới i-a_i và i+a_i. Nếu chạy BFS riêng cho từng vị trí thì tổng thời gian có thể là bậc hai.
  • Ý tưởng: Đảo chiều toàn bộ cạnh. Trong đồ thị đảo, một đường từ vị trí đích j tới i tương ứng đúng một đường cùng số bước từ i tới j trong đồ thị ban đầu.
  • Ý tưởng: Chạy hai BFS nhiều nguồn trên đồ thị đảo:
  • Ý tưởng: BFS bắt đầu đồng thời từ mọi vị trí có giá trị chẵn;
  • Ý tưởng: BFS bắt đầu đồng thời từ mọi vị trí có giá trị lẻ.
  • Ý tưởng: Với vị trí mang giá trị lẻ, lấy khoảng cách tới tập nguồn chẵn; với vị trí mang giá trị chẵn, lấy khoảng cách tới tập nguồn lẻ. Đỉnh không được thăm có kết quả -1.
  • Ý tưởng: Đồ thị có không quá 2n cạnh, nên độ phức tạp là O(n) thời gian và bộ nhớ.