公式

G - Add and Multiply Queries 解説 by en_translator


Consider a type-\(3\) query. Let \(M\) be the maximum \(A\).

First, for \(i = l\) we have \(v = 0\), so we should always replace \(v\) with \(v + A[i]\). By the constraints, now \(v\) has become positive. An important observation is that you choose to replace \(v\) with \(v \times B[i]\) at most \(\log_2 M (< 60)\) times roughly, because \(2^{60} > 10^{18}\) and the input never allows us to perform this operation more than \(60\) times.

Therefore, the while true: loop in the algorithm below iterates at most \(59\) times:

v = A[l]
while true:
    next_l = min(r, smallest i after l + 1 such that B[i] >= 2)
    v += sum_a(l + 1, next_l)
    v = max(v + A[next_l], v * B[next_l])
    l = next_l
    if (l == r):
        break
output(v)

By using a segment tree appropriately, the complexity becomes \(O(N + Q \log N \log M)\). The constant factor is very small, so this algorithm is fast enough.

投稿日時:
最終更新: