Flat Mountain

o62_mar_c1_flat2

กำหนดให้ AA เป็นอาร์เรย์ที่ประกอบไปด้วยความสูงของสันเขา และ AiA_i แทนความสูงของสันเขาที่ ii

สังเกตว่าในการดึงสันเขา ขนาดของช่วงที่มีความสูงเท่ากัน จะเปลี่ยนแปลงก็ต่อเมื่อ hAh \in A ดังนั้นในการหาคำตอบ เราจึงจำเป็นต้อง พิจารณา hh ที่แตกต่างกันเพียง nn ค่าเท่านั้น

เราจะพิจารณา h=A1,A2,,Anh = A_1, A_2, \dots, A_n โดยสำหรับแต่ละค่า h=Aih = A_i เราจะหาขนาดของช่วงที่ติดกัน เมื่อช่วงดังกล่าวต้องมีสันเขาที่ ii ประกอบอยู่ด้วย

สังเกตว่าสันเขาภายในช่วงดังกล่าว ความสูงเดิมจะต้องมีค่าไม่น้อยกว่า AiA_i และสันเขาที่ถัดจากช่วงนี้ไปทางซ้ายและขวา จะมีความสูงน้อยกว่า AiA_i มิฉะนั้น จะต้องรวมสันเขานี้เข้าไปในช่วงด้วย ดังนั้น กำหนดให้ช่วง [l,r][l, r] เมื่อ lirl \leq i \leq r เป็นช่วงของสันเขา AiA_i เราจะได้ว่า min{Al,Al+1,,Ar}Ai\min\{A_l, A_{l + 1}, \dots, A_r\} \geq A_i

หากเราไล่ l,rl, r ทีละค่า จะใช้เวลา O(n)\mathcal{O}(n) ต่อการหาขนาดช่วงหนึ่งครั้ง แต่เราสามารถลดเวลาการทำงานลง ด้วยคุณสมบัติที่ว่า หาก min{Ax,Ax+1,,Ai}Ai\min\{A_x, A_{x + 1}, \dots, A_i\} \geq A_i ก็จะได้ว่า min{Ax,Ax+1,,Ai}Ai\min\{A_{x'}, A_{x' + 1}, \dots, A_i\} \geq A_i เมื่อ x>xx' > x เช่นกัน และหาก min{Ai,Ai+1,,Ay}Ai\min\{A_i, A_{i + 1}, \dots, A_y\} \geq A_i ก็จะได้ว่า min{Ai,Ai+1,,Ay}Ai\min\{A_i, A_{i + 1}, \dots, A_{y'}\} \geq A_i เมื่อ y<yy' < y เช่นกัน

จากคุณสมบัติดังกล่าว เราจึงสามารถ Binary Search ค่า xx และ yy ที่น้อยที่สุดและมากที่สุดตามลำดับ จะทำให้ได้ค่า ll และ rr จึงสรุปได้ว่าขนาดช่วงที่ประกอบไปด้วยสันเขา ii จะมีค่าเป็น rlr - l นั่นเอง โดยสำหรับการหา min{Ax,Ax+1,,Ai}\min\{A_x, A_{x + 1}, \dots, A_i\} และ min{Ai,Ai+1,,Ay}\min\{A_i, A_{i + 1}, \dots, A_y\} เราสามารถใช้ Segment Tree ที่รองรับการหาค่าที่น้อยที่สุดในช่วง ทำให้การคิดขนาดช่วงแต่ละสันเขา ใช้เวลาเพียง O(logn)\mathcal{O}(\log n) หรือ O(log2n)\mathcal{O}(\log^2 n) ขึ้นกับ Implementation

เมื่อทราบขนาดช่วงของแต่ละสันเขาเป็นที่เรียบร้อยแล้ว สำหรับปัญหาย่อยที่ 1, 2 และ 3 เราจะตอบความสูงของสันเขาที่มากที่สุดที่ขนาดช่วงมีค่าเท่ากับ ww หรือ 1-1 หากไม่มีสันเขาดังกล่าว

สำหรับปัญหาย่อยที่ 4 เราจะเก็บคำตอบในอาร์เรย์ WW เมื่อ WiW_i เป็นความสูงของสันเขาที่มากที่สุดที่ขนาดช่วงมีค่าเท่ากับ ii หรือ 1-1 หากไม่มีสันเขาดังกล่าว ขณะที่คิดขนาดช่วงของสันเขาที่ ii สมมติให้ขนาดที่ได้เป็น kk เราก็จะกำหนดให้ Wk:=max(Wk,Ai)W_k := \max(W_k, A_i) นั่นเอง

Time Complexity: O(nlogn)\mathcal{O}(n \log n) หรือ O(nlog2n)\mathcal{O}(n \log^2 n)