C. Convenient For Everybody | Codeforces Round #464

便宜上、時刻を[1, n]
=> [0, n)
で表すことにする。
f(i)
:= 時刻iにコンテストを開始したときの参加人数の合計
とする。
(f(i), -i) を最大にするようなiを求めたいのでf(i)が知りたい。
f(i)は累積和で計算する。
f(i) = g[i] のような配列gを考えると
タイムゾーン0について
g[s] += a[0]
g[s+1] += a[0]
...
g[f-1] += a[0]
である。
これは累積和により
h[s] += a[0]
h[f] -= a[0]とし、
g[i] = g[i-1] + h[i]
のように計算できる。
同様にa[1]については
h[s-1] += a[1]
h[f-1] -= a[1]
...
a[k], 0<=k<nについて
h[s-k] += a[k]
h[f-k] -= a[k]

ここでs-k<0となるような可能性があることに注意したい。
b≡c mod n のとき
h[a] = h[c]
なので
h[s-k+n] += a[k]
h[f-k+n] -= a[k]
とできる。
明らかにs-k+n>=0

更に、あるタイムゾーンにおける[s, f)の時間が
他のタイムゾーンでは日をまたいでいる可能性があるため、
2日分見ておく必要がある。
なので
h[s-k+2n] += a[k]
h[f-k+2n] -= a[k]
まで足しておく。