canuc80k1108·9/50

Độ Sâu Theo Cực Đại

Nộp bài trên LQDOJ

Bài 11 · Divide and Conquer

Cho một dãy các số đôi một khác nhau. Ta gắn dãy đó với một cây nhị phân theo quy tắc:

  • Phần tử lớn nhất của dãy là gốc.
  • Các phần tử nằm bên trái phần tử lớn nhất tạo cây con trái theo cùng quy tắc.
  • Các phần tử nằm bên phải phần tử lớn nhất tạo cây con phải theo cùng quy tắc.
  • Một phía không có phần tử thì cây con tương ứng rỗng.

Độ sâu của gốc bằng ; độ sâu của một đỉnh khác là số cạnh trên đường từ gốc đến đỉnh đó.

Với mỗi hoán vị, hãy in độ sâu của các phần tử theo đúng thứ tự chúng xuất hiện trong hoán vị.

Input

  • Dòng đầu chứa số nguyên .
  • Với mỗi bộ kiểm thử:
  • Một dòng chứa .
  • Một dòng chứa hoán vị của các số từ đến .

Output

  • Với mỗi bộ kiểm thử, in một dòng gồm số nguyên; số thứ là độ sâu của phần tử ở vị trí .

Constraints

  • .
  • .
  • Mỗi giá trị từ đến xuất hiện đúng một lần trong hoán vị.

Scoring

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

Example

Test 1

Input

1
5
2 5 1 4 3

Output

1 0 2 1 2

Giải thích: Giá trị là gốc. Bên trái chỉ có ; bên phải có gốc là , với hai con là và , nên các độ sâu lần lượt là .

Lời giải tóm tắt
  • Ý tưởng: Không cần dựng con trỏ cây. Mỗi lời gọi giữ một đoạn của hoán vị và độ sâu của gốc đoạn đó.
  • Thuật toán: 1. Với đoạn [l,r], tìm vị trí p của phần tử lớn nhất. 2. Gán độ sâu hiện tại cho p. 3. Gọi đệ quy trên [l,p-1] và [p+1,r] với độ sâu tăng một. 4. In mảng độ sâu.
  • Chứng minh tính đúng đắn: Theo định nghĩa, cực đại của đoạn bắt buộc là gốc nên thuật toán gán đúng độ sâu cho vị trí p. Mọi phần tử bên trái chỉ thuộc cây con trái và mọi phần tử bên phải chỉ thuộc cây con phải. Theo quy nạp, hai lời gọi con gán đúng độ sâu tương đối trong từng cây con; tăng một mức cho ta độ sâu tuyệt đối đúng. Do đó toàn bộ kết quả là chính xác.
  • Độ phức tạp: Thời gian trong trường hợp xấu nhất, bộ nhớ ngăn xếp ; phù hợp với .