toi

TOI17 sequel - กำแพงนคร: ภาคต่อ (The Wall: The Sequel)

🏠 รวมเฉลย TOI17

💎 problem.pdf

🎉 solution.cpp

square root decomposition + quicksum

ถ้าสมมติเรา ทำตรงๆ

for (i = L; i <= R: i += step) sum += input[i];

แบบนี้จะใช้เวลา O(question * (n / step)) ถ้า step มีค่า 1,2,3,4,5 ก็จะมีค่าประมาณ O(question * n)

เราเลยต้องคิดว่า

เราก็เลยจะคำนวนตัวน้อยๆไว้ก่อน เช่น คำนวน step=1 ด้วย quicksum ปกติ

quicksum[step, i] = quicksum[step, i - step] + input[i]

แล้วทำถึงค่า k ที่เท่าไหร่ถึงจะดีหละ ?

ก็ตั้งสมการ

เวลารวม = O(n * k) + O(q * n / k) = O(n * (k + q / k))

ต้องการให้เวลารวมน้อยสุด คือให้ k = sqrt(q) จะได้ = O(n * (sqrt(q) + sqrt(q))) เป็นเวลาที่ทำได้ดีสุดใน worse case แล้ว ถ้าเราให้ n = q ก็จะได้คำตอบเป็น O(n * sqrt(n))