canuc80k6503·4/50

Trung vị của cửa sổ

Nộp bài trên LQDOJ

Bài 65 · Balanced Binary Search Tree

Cho mảng số và độ dài cửa sổ . Với từng cửa sổ liên tiếp, in trung vị; khi chẵn, dùng trung vị nhỏ hơn trong hai phần tử giữa.

Cửa sổ thứ nhất là đoạn chỉ số , sau đó mỗi lần dịch sang phải đúng một vị trí. Nếu chẵn, trung vị được định nghĩa là phần tử thứ trong thứ tự không giảm.

Input

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

Output

  • In trung vị theo thứ tự các cửa sổ từ trái sang phải.

Constraints

  • .
  • Mỗi giá trị có độ lớn không vượt .

Scoring

  • Subtask small: điểm, gồm test nhỏ.
  • Subtask full: điểm, gồm test không có giới hạn bổ sung ngoài phần Constraints.
  • Mỗi test có giá trị điểm.

Example

Test 1

Input

7 4
8 1 5 2 9 3 6

Output

2 2 3 3

Giải thích: Bốn cửa sổ sau khi sắp lần lượt là và . Vì lấy phần tử giữa nhỏ hơn, các trung vị là .

Lời giải tóm tắt
  • Ý tưởng: Duy trì đúng k phần tử của cửa sổ hiện tại trong Treap đa tập. Chỉ số trung vị 1-based là (k+1)/2. Sau khi in trung vị, nếu còn cửa sổ tiếp theo thì xóa a[i] và chèn a[i+k]. Hàm kth đi theo kích thước cây con trái và số bản sao tại nút.
  • Chứng minh đúng: Bất biến vòng lặp: trước lần in thứ i, Treap chứa đúng a[i..i+k-1]. Bất biến đúng ở cửa sổ đầu; phép xóa/chèn chuyển chính xác sang cửa sổ kế tiếp. Duyệt giữa của Treap là dãy cửa sổ đã sắp xếp, nên phần tử thứ (k+1)/2 là trung vị được đề quy ước.
  • Độ phức tạp: Kỳ vọng O(n log k) thời gian, O(k) bộ nhớ.