解説
Si と Sj の共通部分に点 (x,y) が存在するための条件は、
(j−i)x≤Ai+Aj,(j−i)x≥−(Ai+Aj)
である。よって、 Si と Sj の共通部分に含まれる点の x 座標の最大値は
f(i,j)=j−iAi+Aj
である。したがって、求める答えは
i=1∑N−1j=i+1∑N⌊j−iAi+Aj⌋
となる。
各組 (i,j) について、
⌊j−iAi+Aj⌋
は、 k(j−i)≤Ai+Aj を満たす正整数 k の個数に等しい。
主客転倒より、各整数 kについて、 k(j−i)≤Ai+Aj を満たす組 (i,j) の個数を求め、それらを合計すればよい。
適当な正整数 B を定め、 k を k≤B と k>B に分けて考える。
-
k≤B
k(j−i)≤Ai+Aj が成り立つことと、区間 [ki−Ai,ki+Ai],[kj−Aj,kj+Aj] が共通部分を持つことは同値である。したがって、各 i に対する区間の両端の値をソートし、共通部分を持つ区間の組の個数を数えれば良い。
計算量は O(BNlogN) である。
-
k>B
このとき、k(j−i)≤Ai+Aj を満たす k>B が存在するならば、 (B+1)(j−i)≤Ai+Aj≤2N が成り立つ。よって、 j−i≤B+12N を満たす i,j について考えれば良い。
i,j に対して条件を満たす k>B の個数は max(0,⌊j−iAi+Aj⌋−B) であるので、これらを足せば良い。
計算量は O(BN2) である。
以上より、計算量は O(BNlogN+BN2) となる。
B=Θ(logNN) とすることで、 O(NNlogN) でこの問題を解くことができる。