canuc80k6506·7/50

Đảo các đoạn con

Nộp bài trên LQDOJ

Bài 65 · Balanced Binary Search Tree

Cho chuỗi chữ hoa. Mỗi truy vấn đảo ngược đoạn ký tự . In chuỗi sau tất cả truy vấn.

Mỗi cặp đảo thứ tự các ký tự ở vị trí của xâu hiện tại. Các vị trí được đánh số từ và hai đầu đoạn đều được tính.

Input

  • Dòng đầu chứa . Dòng thứ hai chứa xâu ban đầu dài . Mỗi dòng trong số dòng tiếp theo chứa .

Output

  • In xâu sau khi thực hiện toàn bộ thao tác.

Constraints

  • .
  • Mọi đoạn thỏa .

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

6 3
ABCDEF
2 5
1 3
4 6

Output

DEAFBC

Giải thích: Đảo vị trí được AEDCBF, sau đó đảo được DEACBF. Đảo tiếp tạo xâu cuối DEAFBC.

Lời giải tóm tắt
  • Ý tưởng: Tách cây thành L, M=[a,b], R. Gọi applyRev(M): đổi chỗ hai con của gốc M và bật cờ rev. Khi đi xuống một nút, push truyền cờ cho hai con. Sau đó ghép lại L+M+R. Duyệt cuối cũng gọi push, nên thứ tự xuất là thứ tự logic sau mọi đảo.
  • Chứng minh đúng: Đảo thứ tự một dãy được biểu diễn bởi cây con T tương đương đổi vai trò trái/phải ở mọi nút của T. Cờ rev thực hiện phép đó lười: tại gốc đổi hai con, rồi ghi rằng hai cây con cũng cần đảo. push bảo đảm trước khi đọc cấu trúc con, phép đảo chưa thực hiện được truyền xuống. Vì mỗi thao tác cô lập đúng M và chỉ tác động M, dãy ngoài đoạn không đổi; M trở thành reverse(M), đúng yêu cầu.
  • Độ phức tạp: Kỳ vọng O(log n) mỗi truy vấn, O(n) bộ nhớ.