其他分享
首页 > 其他分享> > 洛谷 P5501 [LnOI2019]来者不拒,去者不追

洛谷 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