Codeforces Round #560 (Div. 3) E. Two Arrays and Sum of Functions
問題概要
長さ の数列 が与えられます. この数列に対して, 関数 を以下のように定めます:
の要素を自由に並び変えられるとき, の最小値を求めてください. ただし答えが非常に大きくなる可能性があるので, で割った余りを求めてください.
制約
解法
番目の要素の計算にほかの要素がかかわってこないので, 主客逆転することで求められそうです. つまり, 番目の要素は何回答えに足されるか?を考えようということです.
そのためには 番目の要素を含むような区間の選び方は何通りあるかを求める必要があります. もし, 番目の要素を含むような区間の選び方が 通りなら,
のように式変形をすることができるので, うまいこと を求めれば線形で答えが出ます.
まず, についてですが, これは 番目の要素が選ばれるには 以下から が, 以上から が選ばれればよいです. これは 通りだけあります.
さらに の並び替えは, の大きいものに が小さいやつを割り当てていけばいいです. このようなマッチングが最小になる事実は有名で, 例えばこれなどでみることができます(ネタバレ注意).