Playing Connection Woods

2 secs 1024 MB
matcharate12's icon matcharate12

この問題は主に区間スケジューリングを問います。

AA は単調増加または単調減少数列で与えられ、木材単体を切り離さないことを言い換えると、1iL1\le i\le L において min(A(i,1),...A(i,L))\min (A_{(i,1)},...A_{(i,L)}) 日目から max(A(i,1),...A(i,L))\max (A_{(i,1)},...A_{(i,L)}) 日目までの連続するタスクと考え、その連続するタスクの日にちと重複しているタスクが存在しないことが条件となります。
これはいわゆる"区間スケジューリング問題"に帰着することができます。この問題を考え、木材単体を切り離してはいけないという条件は、重複しているタスクが 11 つもないことを満たすことが必要十分です。区間スケジューリング問題の解説はここでは省略しますが、他の記事などを見てみることをおすすめします。
以上から、計算量は O(Nmax(Li))O(N\max (L_i)) で正解することができます。以下は解答例(C++)です。