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)=\sum_{1\le a<b \le n,(a,b)=1,a+b\ge n} {1\over ab}=f(n-1)+\sum_{i\perp n}{1\over in}-\sum_{a<b,a+b=n-1,(a,b)=1} {1\over ab} \]

\[g(n)=\sum_{a<b,a+b=n,(a,b)=1} {1\over ab}={1\over n}\sum_{1\le a<b\le n,a+b=n,(a,b)=1} {a+b\over ab}={1\over n}\sum_{(a,n-a)}{1\over a}={1\over n}\sum_{a\perp n}{1\over a} \]

\(f(n)=f(n-1)+g(n)-g(n-1)\)

posted @ 2020-07-28 14:35  Grice  阅读(200)  评论(0)    收藏  举报