Abridged Problem Statement
กำหนดอาร์เรย์ เป็นอาร์เรย์ของการเรียงสับเปลี่ยนของตัวเลขตั้งแต่ ถึง ให้ฟังก์ชัน โดยที่ สำหรับจำนวนเต็มบวก ตั้งแต่ ถึง ให้ โดยที่ สำหรับ และ สำหรับ
หรือก็คือฟังก์ชันที่หาจำนวนชั้นที่น้อยที่สุดของ ที่ทำให้ เรานิยามให้ เรามีคำถามอยู่ คำถาม แต่ละคำถามจะถามว่า สมมติว่าเราสามารถสลับที่ค่าในตำแหน่ง ใด ๆ บนอาร์เรย์ ได้ไม่เกิน ครั้ง เราจะสามารถทำให้ มีค่าน้อยที่สุดได้เท่าไหร่
Observation 1
หากว่า สำหรับ ตั้งแต่ ถึง แล้ว จะมีค่าเท่ากับ โดยทันทีซึ่งน้อยที่สุดเท่าที่จะทำได้ และเราสามารถสลับไม่เกิน รอบเพื่อให้ทำให้ ดังนั้นสำหรับค่า ที่เกิน นั้น จะมีค่า โดยทันที
Observation 2
พิจารณากราฟมีทิศทางขนาด ที่สร้างจาก โดยให้โหนดที่ มีเส้นเชื่อมไปยังโหนดที่ เราจะสามารถแบ่งกราฟเป็นกราฟที่มีหน้าตาเป็นวงวนได้ ซึ่งค่าของ จะเท่ากับความยาวของวงวนของ และทุก ๆ ซึ่งอยู่ในวงวนเดียวกับ จะมีคุณสมบัติที่ ดังนั้นเราจะหาค่า ได้ใน โดยการหาความยาวแต่ละวงวน และเก็บไว้ว่าวงวนไหนที่เคยไปแล้วบ้าง
Observation 3
สำหรับ บนอาร์เรย์ ถ้า แล้ว หากเราสลับค่าในตำแหน่ง กับตำแหน่ง แล้ว วงวนเดิมจะแตกเป็นสองวงวนที่มีขนาด และขนาด เมื่อ เป็นขนาดของวงวนเดิม ซึ่งเราจะสังเกตได้ว่าถ้าเราสลับค่าใน ตำแหน่ง กับ หาก เราจะสามารถแบ่งวงวนออกเป็น วงซึ่งมีขนาด และ ตามลำดับ
Subtask 1
เราจะสร้างอาร์เรย์ โดยที่ ค่า ที่น้อยที่สุดที่มีการสลับที่ไม่เกิน ครั้ง ซึ่งตอนแรกเราจะให้เป็น ทุกช่อง พิจารณาทุกการเรียงสับเปลี่ยนที่เป็นไปได้ เราจะหาจำนวนครั้งที่ต้องสลับตัวใน เพื่อให้ได้การเรียงสับเปลี่ยนที่กำลังพิจารณา ขอแทนด้วย ซึ่งทำได้โดยการที่ไล่จาก ถึง หากที่ตำแหน่ง นั้นเราพบว่า เราจะสลับค่าที่ตำแหน่ง ใน กับค่าที่ตำแหน่งที่ ซึ่ง เราสามารถพิสูจน์ได้ว่า และวิธีนี้ใช้การสลับเพื่อเปลี่ยนจาก เป็น น้อยที่สุดเสมอ ให้จำนวนครั้งที่ต้องสลับมีค่า หลังจากนั้นเราจะหาค่า ของ ซึ่งขอแทนด้วย เราจะแก้ไข ให้ หลังจากที่เราพิจารณาทุกการเรียงสับเปลี่ยนแล้ว เราจะไล่จาก ถึง และกำหนดให้ แล้วก็ตอบทุกคำถามใน
Time Complexity:
Subtask 2
จาก Observation 3 เราจะสามารถเปลี่ยนโจทย์ได้เป็น ในคำถามที่ เราจะหาจำนวนเต็มบวก ที่น้อยที่สุด ซึ่งทำให้มีจำนวนเต็มบวก และ ซึ่ง และ และ ซึ่งคำตอบของคำถามนี้คือ
Time Complexity:
Subtask 3
ค่า จาก ที่รับเข้ามาจะเป็น เสมอ ซึ่งเราสามารถลดให้เหลือ ได้ด้วยจำนวนครั้งที่น้อยที่สุดคือ ครั้ง โดยการสลับค่าที่ตำแหน่ง กับตำแหน่งที่ สำหรับ ตั้งแต่ ถึง ดังนั้นสำหรับแต่ละคำถาม จะมีแค่สองคำตอบคือ สำหรับ และ สำหรับ
Time Complexity:
Subtask 4
จาก Observation 3 และ Subtask 2 เราจะได้ว่าเราสามารถแปลงปัญหาได้เป็น ในคำถามที่ หาก นั้นประกอบด้วยวงวนขนาด เราจะหาค่า ที่น้อยที่สุดซึ่งทำให้เราสามารถแบ่ง ออกเป็น ส่วน ส่วนละไม่เกิน และ ซึ่งเราสามารถ เพื่อหาคำตอบได้ โดยเรา ตามค่า ว่า ที่ค่า เท่านี้เราจะแบ่งตามเงื่อนไขได้หรือไม่ ซึ่งสำหรับ ใด ๆ หากต้องการแบ่งให้ทุกส่วนมีค่าไม่เกิน จะใช้ทั้งหมด เหตุผลที่เราสามารถ binary search ได้นั้นเพราะบนค่า ที่เพิ่มขึ้นนั้นค่า จะไม่มีทางเพิ่มขึ้นแน่นอน
Time Complexity:
Subtask 5
เราจะมีอาร์เรย์ ซึ่ง เท่ากับจำนวนครั้งที่น้อยที่สุดที่เราจะสามารถสลับแล้วทำให้ค่า มีค่าไม่เกิน ซึ่งเราจะสามารถคำนวณ โดยให้ตอนแรก สมมติว่า นั้นประกอบด้วยวงวนขนาด เราจะทำขั้นตอนดังต่อไปนี้
for j in (1, 2, ..., v) do for i in (1, 2, ..., C[j]) do dp[i] = dp[i] + ceil(C[j] / i) - 1 end for end for
ซึ่งค่า dp(i) ที่ได้หลังจบลูปนั้นจะเป็นตามนิยามที่ให้ไว้ และลูปนี้ทำงานใน หลังจากที่เราได้ค่า แล้วในคำถามที่ เราจะ binary search หาค่า ที่น้อยที่สุดที่ทำให้
Time Complexity: