很显然对于上式,要使得每一个 ci 尽可能小,因为 ci−1 尽可能小,ci 也会尽可能小。
作如下考虑
x,x,x,x,j,i,x,x,x,x
x,x,x,x,i′,j′,x,x,x,x
假设有两个相邻的位置 ci,cj,在什么情况下交换 ci,cj 能使 cj 减小。
令 sumi=j=1∑iaj.
那么有
cj=max(cj−1+bj,sumj+bj)
ci=max(cj,sumi)+bi=max(cj−1+bj+bi,sumj+bj+bi,sumi+bi)
交换后有
ci′=max(cj−1+bi,sumi−aj+bi)
cj′=max(cj−1+bi+bj,sumi−aj+bi+bj,sumi+bj)
那么 cj′≥ci 这说明 j 在 i 前面。
首先,如果 ci=cj−1+bj+bi,那么 cj′≥ci 一定成立(很好理解吧)。
所以在比较 cj′,ci 时可以忽略 cj−1+bj+bi.
所以只需要比较
max(sumi−aj+bi+bj,sumi+bj)≥max(sumj+bj+bi,sumi+bi)
max(sumi−aj,sumi−bi)≥max(sumj,sumi−bj)
然后再减 sumi,注意 sumj−sumi=−ai
max(−aj,−bi)≥max(−ai,−bj)
min(aj,bi)≤min(ai,bj)
也就是说,如果上式满足,则有 j 在 i 前面。
但不具备传递性,也就是假设有 j 在 i 前面且 k 在 j 前面,不一定有 k 在
i 前面。
分类讨论
-
ai≤bi 则有 aj≤ai且 aj≤bj 这一组按a升序排列。
-
ai>bi 则有 bj≥bi或bj≥aj 这一组按b降序排列。
如果 abs(ai−bi)ai−bi≤0,分到1.
如果 abs(ai−bi)ai−bi>0,分到2.
代码就很好写了,记得long long
。