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 $Al, A{l+1}, \ldots, A_r$.2 l r x: Add $x$ to each of $Bl, 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: 在 $Al, A{l+1}, \ldots, A_r$ 中的每一条添加 $x$ 。2 l r x: 向 $Bl, 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后会变为
故我们使用线段树维护三个量 $\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,多取模。