AtCoder Beginner Contest 357-F
Problem
You are given sequences of length \(N\), \(A=(A_1,A_2,\ldots,A_N)\) and \(B=(B_1,B_2,\ldots,B_N)\).
You are also given \(Q\) queries to process in order.
There are three types of queries:
1 l r x
: Add \(x\) to each of \(A_l, A_{l+1}, \ldots, A_r\).2 l r x
: Add \(x\) to each of \(B_l, B_{l+1}, \ldots, B_r\).3 l r
: Print the remainder of \(\displaystyle\sum_{i=l}^r (A_i\times B_i)\) when divided by \(998244353\).
给你两个长度为 \(N\) 的序列 \(A=(A_1,A_2,\ldots,A_N)\) 和 \(B=(B_1,B_2,\ldots,B_N)\) 的序列。
需要按顺序处理 \(Q\) 个查询。
查询有三种类型:
1 l r x
: 在 \(A_l, A_{l+1}, \ldots, A_r\) 中的每一条添加 \(x\) 。2 l r x
: 向 \(B_l, B_{l+1}, \ldots, B_r\) 中的每一条添加 \(x\) 。3 l r
: 打印 \(\displaystyle\sum_{i=l}^r (A_i\times B_i)\) 除以 \(998244353\) 的余数。
Constraints
- \(1\leq N,Q\leq 2\times 10^5\)
- \(0\leq A_i,B_i\leq 10^9\)
- \(1\leq l\leq r\leq N\)
- \(1\leq x\leq 10^9\)
- 全是整数
Solution
看到 \(N,Q\) 的取值范围,发现需要在 \(n\log n\) 的复杂度内解决。值域 \(1\le x\le 10^9\) 也不好做文章。
数列\(A,B\)在\([l,r]\)上在进行操作1 l r x
和2 l r y
后会变为 \[
\begin{align}
&\sum_{i=l}^r(A_i+x)\times (B_i+y)\\
&=\sum_{i=l}^rA_i\times B_i+x\sum_{i=l}^r B_i+y\sum_{i=l}^r A_i+xy(r-l+1)
\end{align}
\] 故我们使用线段树维护三个量 \(\sum A_i\times B_i,\sum A_i,\sum B_i\) 和lazy标记 \(Add_a,Add_b\)
当执行1 l r x
时
- \(\sum A_i\times B_i\) 增加 \(x\sum B_i+x\cdot Add_b\cdot(r-l+1)\)
- \(\sum A_i\) 增加 \(x(r-l+1)\)
- \(Add_a\) 增加 \(x\)
当执行2 l r y
时
- \(\sum A_i\times B_i\) 增加 \(y\sum A_i+y\cdot Add_a\cdot(r-l+1)\)
- \(\sum B_i\) 增加 \(y(r-l+1)\)
- \(Add_b\) 增加 \(y\)
Code
1 |
|
Attention
开LL,多取模。