Higher Tower

o60_mar_c1_higher

ในข้อนี้ กำหนดให้อาร์เรย์ AA ประกอบไปด้วยความสูงของตึก ณ เวลาใด ๆ โดย AiA_i เมื่อ 0in10 \leq i \leq n - 1 เป็นความสูงของตึกตำแหน่ง ii

เมื่อมีการสร้างตึก ณ ตำแหน่ง ii โดยมีความสูง hh เราจะกำหนดให้ Ai:=hA_i := h และค่า dd ของตึกนี้ จะเป็นไปได้ 2 กรณีได้แก่

  1. ตึกนี้เป็นตึกที่สูงที่สุด ดังนั้นจะได้ว่า d=nd = n
  2. มีอย่างน้อยหนึ่งตึก jj ที่ Aj>AiA_j > A_i ดังนั้นจะได้ว่า d=(min0jn1,Aj>Aiij)1d = (\min \limits_{0 \leq j \leq n - 1, A_j > A_i} |i - j|) - 1

สำหรับกรณีที่ 2 หากเราไล่หาทีละ jj จะทำให้ใช้เวลา O(n)\mathcal{O}(n) ต่อการสร้างตึก แต่สังเกตว่าตึก ii จะเป็นตึกที่สูงที่สุดในระยะ kk กิโลเมตร ก็ต่อเมื่อ max(max{Aik,Aik+1,,Ai1},max{Ai+1,Ai+2,,Ai+k})Ai\max(\max\{A_{i - k}, A_{i - k + 1}, \dots, A_{i - 1}\}, \max\{A_{i + 1}, A_{i + 2}, \dots, A_{i + k}\}) \leq A_i และเมื่อตึก ii เป็นตึกที่สูงที่สุดในระยะ kk กิโลเมตรแล้ว ก็จะได้ว่าเป็นตึกที่สูงที่สุดในระยะ 0,1,2,,k10, 1, 2, \dots, k - 1 กิโลเมตรเช่นกัน

ดังนั้น จากคุณสมบัติด้านบนนี้ เราจะสามารถ Binary Search เพื่อหา kk ที่มากที่สุดที่ตึก ii ยังคงเป็นตึกที่สูงที่สุดในระยะ kk กิโลเมตร โดยสำหรับการหาค่า max{Aik,Aik+1,,Ai1}\max\{A_{i - k}, A_{i - k + 1}, \dots, A_{i - 1}\} และ max{Ai+1,Ai+2,,Ai+k}\max\{A_{i + 1}, A_{i + 2}, \dots, A_{i + k}\} สามารถหาได้ภายใน O(logn)\mathcal{O}(\log n) ด้วยการเก็บอาร์เรย์ AA ในรูปของ Segment Tree ที่รองรับการหาค่าที่มากที่สุดเป็นช่วงนั่นเอง

จากวิธีดังกล่าว ในการสร้างตึกแต่ละครั้ง เราจะสามารถหาค่า dd ได้ภายในเวลา O(log2n)\mathcal{O}(\log^2 n) หรือ O(logn)\mathcal{O}(\log n) ขึ้นกับการ Implementation

Time Complexity: O(klog2n)\mathcal{O}(k \log^2 n) หรือ O(klogn)\mathcal{O}(k \log n)