洛谷 P5501 [LnOI2019]来者不拒,去者不追
作者:互联网
题目描述
给定长度为 \(n\) 的序列 \(a\),给出 \(m\) 个询问。
对于每个询问,给出一个区间 \([l,r]\),求
\[\sum_{i=l}^{r}{\left(1+\sum_{j=l}^{r}{[a_j<a_i]}\right)a_i} \]数据范围:\(1\le n,m\le 5\times 10^5\),\(a_i\le 10^5\),\(1\le l \le r \le n\)。
时间范围:\(3000\operatorname{ms}\)。
Solution 1
看题目可以发现是求区间排名,求区间和显然不好在线维护,考虑莫队。
对于已有的区间 \([l,r]\),若向右插入一个元素,贡献为
\[\sum_{i=l}^{r}{[a_i>a_{r+1}]a_i}+a_{r+1}\left(1+\sum_{i=l}^{r}{[a_i<a_{r+1}]}\right) \]直接维护的复杂度为 \(\Theta(n\sqrt n\log a_{\max})\),期望得分 \(0\operatorname{pts}\)。
Solution 2
上边的带 \(\log\) 莫队是没有前途的,考虑二次离线。
考虑前缀和,向右插入一个元素,贡献为
\[\sum_{i=1}^{r}{[a_i>a_{r+1}]a_i}+a_{r+1}\left(1+\sum_{i=l}^{r}{[a_i<a_{r+1}]}\right)-\sum_{i=1}^{l-1}{[a_i>a_{r+1}]a_i}+a_{r+1}\left(1+\sum_{i=l}^{r}{[a_i<a_{r+1}]}\right) \]定义 \(f_r=\sum_{i=1}^{r}{[a_i>a_{r+1}]a_i}+a_{r+1}\left(1+\sum_{i=l}^{r}{[a_i<a_{r+1}]}\right)\),则贡献变为
\[f_r-\sum_{i=1}^{l-1}{[a_i>a_{r+1}]a_i}+a_{r+1}\left(1+\sum_{i=l}^{r}{[a_i<a_{r+1}]}\right) \]将 \(f\) 数组预处理出来,后边的贡献离线下来维护,套上值域分块即可处理。
向左插入同理。
时间复杂度为 \(\Theta((n+m)\sqrt {a_{\max}})\),加上奇特的卡常技巧,期望得分 \(100\operatorname{pts}\)。
Code
在写了。
标签:le,洛谷,LnOI2019,sum,插入,去者,区间,operatorname,left 来源: https://www.cnblogs.com/VCLS01/p/14766001.html