2020 Multi-University Training Contest 1
朝鲜场好难啊
A
咕咕
B
调整为\(t_1<t_2<t_3<\cdots<t_n\)
结论1:若最优解最后一个任务为\(i\),一定存在一个最优解为\(\cdots,i+1,i+2,\cdots,n-1,n,i\)
证明:
\(\forall j\in(i,n]\),等待时间比\(i\)短
故不需要利用其它的去减少\(j\)的等待时间,故\(j\)应该在最后一块
对于相邻两个\(j<k\in(i,n]\),若顺序为\(k,j\),将其交换一定不会变劣
二分等待时间,令\(f_i\)为结束\([1,i]\)时最早的时间
\(O(logVn^2)\)
code(这份代码用到了下面结论2,但不影响结果,与std对拍过,但不保证没有错误)
官方题解就很神仙了
结论2:若最优最后一个任务为\(i\),对于最优解\(\cdots,i+1,i+2,\cdots,n-1,n,i\),\(\forall j\in(i,n]\)满足\(T_i+D_i>T_j+D_j\)
证明:
考虑最大的\(j\in(i,n]\),\(T_i+D_i\le T_j+D_j\)
根据不等式列一列可以发现任务列表更改为\(\cdots,i+1,i+2,\cdots,j-1,i,j+1\cdots,n-1,n,j\)不会变劣
同样二分等待时间\(M\)
令\(f_i\)为时任务列表\([i,n]\)满足条件的最晚开始时间
大概的转移流程:令\(next_i\)为最小的\(j>i,T_i+D_i\le T_j+D_j\),对于\(k\in(i,next_i]\),用\(min(f_k,T_i+D_i+M)-(Dsum_{k-1}-Dsum_{i-1})\),我们去最大值
当然中间还有很多细节,因为我们要保证约束条件,下面我们来讨论一下
- 利用\(f_k\)更新时,相当于把\(i,k-1,k-2,\cdots,i+2,i+1\)顺序补充在时间的后面,我们要保证接的时间不能小于其开启时间
即若我们用\(f_k\)得到\(f_i\)时,贪心的将\(\{i+1,i+2,\cdots,k-2,k-1,i\}\)任务序列填上后,时间会大于\(f_k\)
考虑\(i<k(k\le next_i)\),用\(min(f_k,T_i+D_i+M)-(Dsum_{k-1}-Dsum_{i-1})\)更新
需要满足\(min(f_k,T_i+D_i+M)\ge D_i+A_j+(Dsum_{k-1}-Dsum_{j-1})(j\in(i,k))\)(对于等待时间是否合法仅需判断\(i\))
这里有个细节,就是如果时间有空档那么我们不能用\((Dsum_{k-1}-Dsum_{j-1})\)去表示时间啊
没事,如果有空档,那么我们选择靠后的\(j\)去判断会使得条件更严苛
结论3:对于\(i<k(k\le next_i)\),若\(f_k\le T_i+D_i+M\),则用\(f_k\)更新完\(f_i\)后不需要了
证明:
若\(f_k\le T_i+D_i+M\),\(i'<i\),若用\(f_k\)更新\(f_i,f_{i'}\),则满足\(f_k\le T_i+D_i+M<T_{i'}+D_{i'}+M\)
用\(f_k-(Dsum_{k-1}-Dsum_{i-1})\)更新\(f_i\),用\(f_k-(Dsum_{k-1}-Dsum_{i'-1})\)更新\(f_{i'}\)可以转化为用\(f_i-(Dsum_{i-1}-Dsum_{i'-1})\)更新\(f_{i'}\)
且转移条件不会变劣
故可以用\(O(n)\)实现转移
code
G
咕咕
H
咕咕
J
\(f(n)=f(n-1)+g(n)-g(n-1)\)

浙公网安备 33010602011771号