ทำงานทำงาน

o62_may11_twomachinejobs

สมมติว่าในตารางของเรามีการทำงาน ii ต่อด้วยงาน jj เวลาที่งาน ii ทำเสร็จจะมีค่าเท่ากับ T+Ai+BiT+A_i+B_i และเวลาที่งาน jj ทำเสร็จจะมีค่าเท่ากับ T+Ai+Aj+BjT+A_i+A_j+B_j เมื่อ TT คือเวลาที่ใช้ก่อนหน้าจะทำงานที่ ii

ดังนั้นคำตอบจะเป็นอย่างน้อย max(T+Ai+Bi,T+Ai+Aj+Bj)max(T+A_i+B_i, T+A_i+A_j+B_j) ซึ่งมีค่าเท่ากับ P=T+max(Ai+Bi,Ai+Aj+Bj)P = T + max(A_i+B_i, A_i+A_j+B_j)

สมมติให้ BiBjB_i \leq B_j เราจะลองสลับลำดับการทำงานของงาน ii และ jj โดยให้งาน jj ทำก่อนงาน ii คำตอบจะเป็นอย่างน้อย P=T+max(Aj+Bj,Aj+Ai+Bi)P^* = T+max(A_j+B_j, A_j+A_i+B_i)

เราจะพิสูจน์ว่า PPP^* \leq P

หาก Aj+Bj>Aj+Ai+BiA_j+B_j > A_j+A_i+B_i นั่นคือ P=T+Aj+BjP^* = T+A_j+B_j และ Bj>Ai+BiB_j > A_i+B_i ดังนั้น Aj+Bj>Bj>Ai+Bi>BiA_j+B_j > B_j > A_i+B_i > B_i ดังนั้น P=T+Ai+Aj+BjP = T+A_i+A_j+B_j ซึ่งหมายความว่า PPP^* \leq P

หาก Aj+BjAj+Ai+BiA_j+B_j \leq A_j+A_i+B_i นั่นคือ P=T+Aj+Ai+BiP^* = T+A_j+A_i+B_i และจาก BiBjB_i \leq B_j จะได้ว่า P=T+Aj+Ai+BiT+Aj+Ai+Bj=PP^* = T+A_j+A_i+B_i \leq T+A_j+A_i+B_j = P นั่นเอง \blacksquare

สิ่งที่พิสูจน์ข้างต้นทำให้เราสรุปได้ว่า หากเรามีแผนการทำงานใด ๆ ที่เราทำ ii แล้วทำ jj แล้ว Bi<BjB_i < B_j เราสามารถสลับให้เราทำงาน jj ก่อนแล้วทำ ii โดยไม่ทำให้คำตอบแย่ลง

ดังนั้นสมมติว่าเรามีแผนการทำงานที่มีคำตอบที่ดีสุดใด ๆ เราสามารถสลับลำดับของงานตามที่ได้กล่าวไปข้างต้นโดยไม่ทำให้คำตอบแย่ลงเช่นกัน ดังนั้นเมื่อสลับจนสลับต่อไม่ได้แล้ว จะได้คำตอบที่ดีที่สุดนั่นเอง

นั่นหมายความว่า เราควรทำงานตามลำดับ BiB_i จากมากไปน้อย จึงจะได้คำตอบที่ดีที่สุด

สำหรับ subtask ที่ 1 เราสามารถตำนวณได้ตรง ๆ ใช้เวลา O(N2)\mathcal{O}(N^2)

สำหรับ subtask ที่ 2 ให้เรารับ BiB_i ทั้งหมดมาก่อน ขั้นตอนคำนวณคำตอบให้ใช้ segment tree with lazy propagation ในการหาคำตอบ เวลาที่ใช้จะมีค่าเท่ากับ O(NlogN)\mathcal{O}(N\log N)

สำหรับ subtask ที่ 3 นั้นเป็นแบบ fully dynamic นั่นคือเราจะต้องรองรับการ "split" segment tree และ "insert" node เข้าไปตรงกลาง segment tree โครงสร้างข้อมูลที่สามารถใช้แก้ปัญหานี้ได้คือ implicit cartesian tree ซึ่งสามารถ implement ได้โดย treap นั่นเอง ในแต่ละโหนดเราจะเก็บ

  • AiA_i และ BiB_i
  • คำตอบสำหรับช่วงนี้
  • ผลรวมค่า AiA_i สำหรับ node ที่มี key มากกว่า node นี้

เวลาที่ใช้จะมีค่าเท่ากับ O(NlogN)\mathcal{O}(N\log N)