zoukankan      html  css  js  c++  java
  • bzoj4262

    题意

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

    做法一

    (g(S,l_2,r_2):)$$sumlimits_{l=1}{S}sumlimits_{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)
    • 区间求和(每个位置的值为所有时间上的值之和),即(sumlimits_{i=l}^r (sumlimits_{t=1}^{now} val_{i,t}))。时间不增加

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

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

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

    做法二

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

  • 相关阅读:
    实用工具分享
    美国西储大学轴承数据解读
    CSDN去广告插件
    [教程]SPSS for Mac 安装教程
    [教程]Ubuntu 安装 Docker CE
    [教程]Windows操作系统下安装Ubuntu虚拟机
    Chrome视频解析插件
    [软件]MATLAB小波包的分解与重构
    [信号处理]奈奎斯特采样定理
    [软件]LabVIEW编程实例:如何通过TCP协议进行数据通信
  • 原文地址:https://www.cnblogs.com/Grice/p/12425069.html
Copyright © 2011-2022 走看看