对式子进行简化然后莫队
Description
维护一个长度为 $N$的序列$a_n$, $q$次询问,求
$$\sum_{x = 0} ^ \infty {\rm get} (l_1, r_1, x) \times {\rm get} (l_2, r_2, x)$$
${\rm get} (l, r, x)$ 表示区间 $[l,r]$ 中 $x$ 的出现次数。
$n, q \leq 5 \times 10^4$.
Samples
Input #1
1 | 5 |
Output #1
1 | 4 |
Solution
容易发现, 题目中给的式子并不好求, 那么考虑我们在学习前缀和求区间和的时候用到的技巧
首先, 显然:
$${\rm get} (l, r, x) = {\rm get} (1, r, x) - {\rm get} (1, l - 1, x)$$
那么我们把原式子拆开:
$$\text{设} g(r, x) = {\rm get} (1, r, x)$$
$$\text {原式} = \sum_{x = 0} ^ \infty \left[ g(r_1, x) g(r_2, x) - g(r_1, x) g(l_2 - 1, x) - g(r_2, x)g(l_2 - 1, x) + g(l_1 - 1, x) g(l_2 - 1, x)\right]$$
一种理解方式就是$(A - C) (B - D) = AB - BC - AD + CD$
这样我们就可以把询问拆成了四个部分:
$$q_1 = \sum_{x = 0} ^ \infty g(r_1, x) g(r_2, x)$$
$$q_2 = \sum_{x = 0} ^ \infty g(r_1, x) g(l_2 - 1, x)$$
$$q_3 = \sum_{x = 0} ^ \infty g(r_2, x) g(l_1 - 1, x)$$
$$q_4 = \sum_{x = 0} ^ \infty g(l_1 - 1, x) g(l_2 - 1, x)$$
那么最终答案就是$q_1 - q_2 - q_3 + q_4$, 这样直接莫队做就好了.
Code
1 | /* Headers */ |