码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj4262

时间:2020-03-06 10:30:44      阅读:53      评论:0      收藏:0      [点我收藏+]

标签:转换   随机   题意   mat   暴力   赋值   sum   位置   后缀   

题意

给定随机序列\(A\),多组查询\((l_1,r_1,l_2,r_2)\)\[\sum\limits_{l=l_1}^{r_1}\sum\limits_{r=max(l,l_2)}^{r_2}(max\{A[l...r]\}-min\{A[l...r]\})\]

做法一

\(g(S,l_2,r_2):\)\[\sum\limits_{l=1}^{S}\sum\limits_{r=max(l,l_2)}^{r_2}max\{A[l...r]\}\]
则一组询问的最大值部分,可写成\(g(r_1,l_2,r_2)-g(l_1-1,l_2,r_2)\)

考虑转换成这样一个问题

  • 区间赋值,时间增加\(1\)
  • 区间求和(每个位置的值为所有时间上的值之和),即\(\sum\limits_{i=l}^r (\sum\limits_{t=1}^{now} val_{i,t})\)。时间不增加

转换:
考虑枚举右端点,即每次新加入一个右边的位置\(r=1,2,...,n\),然后每个位置\(i\)上的值变成\(max\{A[i...r]\}(i\le r)\),特殊的值为\(0(i>r)\)
用单调栈维护需要修改的位置,是一个当前的后缀区间,即区间赋值

我们把问题转换为上面那个问题了,然后考虑如何做上面那个问题:
对于当前时间\(now\),每个位置上的值都是一段时间变化一次
只需要考虑当前的值,前面的值之和存下来\(sum\)
再存\(val,tim\)。分别表示当前的值;这个值是从\(tim\)开始的,即\(val_{i,tim...now}=val\),用线段树容易维护

\(O(nlogn)\)
现在考虑另一部分,发现将原序列取负,要求的东西跟上面一样

做法二

由于序列是随机的,后缀最大值为期望\(O(logn)\)段的分段函数,然后暴力填平就好了
用线段树维护\(O(nlog^2n)\)

bzoj4262

标签:转换   随机   题意   mat   暴力   赋值   sum   位置   后缀   

原文地址:https://www.cnblogs.com/Grice/p/12425069.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!