zoukankan      html  css  js  c++  java
  • 一道题15

    给n<=50000个longlong范围内的可正可负的数字问下面式子的最大值:

    $f(l,r)=(a_l,a_{l+1},...,a_{r-1},a_r)(sum_{i=l}^{r}a_i-max(a_l,a_{l+1},...,a_{r-1},a_r))$。

    注意到括号里那坨区间和-区间最大值在区间gcd不变的前提下是区间越大越好的。才怪嘞,有负数。

    枚举右端点,注意到从这里往左走gcd会下降最多log次,而且随着右端点往右移动,这些下降的地点会不递减,因此暴力平移这些下降的地点复杂度是$O(nlog_2Max)$的。

    然后就需要询问:一些以某处为右端点的区间的最大的$(sum_{i=l}^{r}a_i-max(a_l,a_{l+1},...,a_{r-1},a_r))$。由于是枚举右端点,那看看加进这个数字之后这些东西会怎么变。

    比如说要加进这个蓝色的东西,现在要看所有以蓝色点为右端点的区间和-Max的最大值怎么变。这条线里面每一个数字表示以这里为左端点,蓝色点为右端点的区间的区间和-Max的最大值。首先有一部分数字的最大值是会变化的,就看成红色的那部分。红色那部分左边剩下的部分最大值不变,可以直接区间+蓝色点数值。红色部分会先加上这区间原本的Max,然后加上蓝色点数值,然后再减去蓝色点数值,也就是加上了原本Max。而区间加、维护原数字区间Max和维护这些(区间和-Max)的最大值的最大值都可以线段树搞定。完。

  • 相关阅读:
    JDK自动安装脚本
    lamp script
    spring MVC multipart处理文件上传
    在Java中定义常量
    常用服务搭建(nfs/ftp/samba)
    源码编译安装mysql5.6
    Spring MVC
    Linux crontab 命令格式与详细例子
    Linux : IPTABLES
    linux monitor and maintanence
  • 原文地址:https://www.cnblogs.com/Blue233333/p/8203239.html
Copyright © 2011-2022 走看看