สมมติว่าในตารางของเรามีการทำงาน ต่อด้วยงาน เวลาที่งาน ทำเสร็จจะมีค่าเท่ากับ และเวลาที่งาน ทำเสร็จจะมีค่าเท่ากับ เมื่อ คือเวลาที่ใช้ก่อนหน้าจะทำงานที่
ดังนั้นคำตอบจะเป็นอย่างน้อย ซึ่งมีค่าเท่ากับ
สมมติให้ เราจะลองสลับลำดับการทำงานของงาน และ โดยให้งาน ทำก่อนงาน คำตอบจะเป็นอย่างน้อย
เราจะพิสูจน์ว่า
หาก นั่นคือ และ ดังนั้น ดังนั้น ซึ่งหมายความว่า
หาก นั่นคือ และจาก จะได้ว่า นั่นเอง
สิ่งที่พิสูจน์ข้างต้นทำให้เราสรุปได้ว่า หากเรามีแผนการทำงานใด ๆ ที่เราทำ แล้วทำ แล้ว เราสามารถสลับให้เราทำงาน ก่อนแล้วทำ โดยไม่ทำให้คำตอบแย่ลง
ดังนั้นสมมติว่าเรามีแผนการทำงานที่มีคำตอบที่ดีสุดใด ๆ เราสามารถสลับลำดับของงานตามที่ได้กล่าวไปข้างต้นโดยไม่ทำให้คำตอบแย่ลงเช่นกัน ดังนั้นเมื่อสลับจนสลับต่อไม่ได้แล้ว จะได้คำตอบที่ดีที่สุดนั่นเอง
นั่นหมายความว่า เราควรทำงานตามลำดับ จากมากไปน้อย จึงจะได้คำตอบที่ดีที่สุด
สำหรับ subtask ที่ 1 เราสามารถตำนวณได้ตรง ๆ ใช้เวลา
สำหรับ subtask ที่ 2 ให้เรารับ ทั้งหมดมาก่อน ขั้นตอนคำนวณคำตอบให้ใช้ segment tree with lazy propagation ในการหาคำตอบ เวลาที่ใช้จะมีค่าเท่ากับ
สำหรับ subtask ที่ 3 นั้นเป็นแบบ fully dynamic นั่นคือเราจะต้องรองรับการ "split" segment tree และ "insert" node เข้าไปตรงกลาง segment tree โครงสร้างข้อมูลที่สามารถใช้แก้ปัญหานี้ได้คือ implicit cartesian tree ซึ่งสามารถ implement ได้โดย treap นั่นเอง ในแต่ละโหนดเราจะเก็บ
- และ
- คำตอบสำหรับช่วงนี้
- ผลรวมค่า สำหรับ node ที่มี key มากกว่า node นี้
เวลาที่ใช้จะมีค่าเท่ากับ