problem


视频讲解链接:https://www.bilibili.com/video/BV1Du411X7Nk

solution

  • 可以直接推导原答案ans = ∑i=1n∑j=in(max−min)=∑i=1n∑j=inmax−∑i=1n∑j=inmin\sum_{i=1}^n\sum_{j=i}^n(max-min) = \sum_{i=1}^n\sum_{j=i}^nmax-\sum_{i=1}^n\sum_{j=i}^nmin∑i=1n​∑j=in​(max−min)=∑i=1n​∑j=in​max−∑i=1n​∑j=in​min,即对于每一段来说的最大值和最小值。

  • 或者从贡献的角度考虑:对于一个数Ai来讲,如果其有贡献的价值,要么是-Ai作为最小值,要么是+Ai作为最大值。
    那么Ans=ΣAi*maxn-Ai*minn,这里maxn表示Ai作为最大值出现的次数,minn表示Ai作为最小值出现的次数。

  • 考虑如何计算这个maxn和minn
    我们设定L【i】表示Ai作为最大值时,左边可以延展到的位子,R【i】表示Ai作为最大值时,右边可以延展到的位子。
    那么对于Ai来讲,其maxn=(i-L【i】+1)-(R【i】-i+1);
    L【i】以及R【i】都可以O(n)维护。
    那么求minn的过程同理相反。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e6+10;
LL a[maxn], l[maxn], r[maxn];
int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n;  cin>>n;for(int i = 1; i <= n; i++)cin>>a[i];LL ans = 0;//maxnfor(LL i = 1; i <= n; i++)l[i]=r[i]=i;for(int i = 2; i <= n; i++){int now = i;while(now>1&&a[i]>=a[now-1])now=l[now-1];l[i] = now;}for(int i = n-1; i >= 1; i--){int now = i;while(now<n&&a[i]>a[now+1])now=r[now+1];r[i] = now;}for(LL i = 1; i <= n; i++){ans += a[i]*(i-l[i]+1)*(r[i]-i+1);}//minnfor(LL i = 1; i <= n; i++)l[i]=r[i]=i;for(int i = 2; i <= n; i++){int now = i;while(now>1&&a[i]<=a[now-1])now=l[now-1];l[i] = now;}for(int i = n-1; i >= 1; i--){int now = i;while(now<n&&a[i]<a[now+1])now=r[now+1];r[i] = now;}for(LL i = 1; i <= n; i++){ans -= a[i]*(i-l[i]+1)*(r[i]-i+1);}cout<<ans<<"\n";return 0;
}

【代码源 Div1#103】子串的最大差 Codeforces - 817D,力扣2104,1900分相关推荐

  1. 【代码源 Div1 - 109】#454. Minimum Or Spanning Tree(最小生成树,边权按位或,贪心,并查集) CF1624G

    problem solution 题意:生成树的代价为他所有边的边权按位或得到的值,求最小生成树 贪心,一般来说,求 按位与 和 按位或 的最大值都可以从高往低逐位的贪心处理 对于当前位 b 而言,若 ...

  2. 【代码源 Div1 - 108】#464. 数数(主席树,区间比k小的数的个数)HDU4417

    problem solution 主席树查询区间比k小的数的个数 建树之后直接在目标区间的主席树内将 H 作为挡板递归计数. #include<bits/stdc++.h> using n ...

  3. 【代码源 Div1 - 105】#451. Dis(倍增求LCA)

    problem solution 给出 n 个点的一棵树,每个点有各自的点权,m 次询问两个点简单路径所构成点集的异或和. 直接在树上求LCA,把每个点权放进去预处理一下即可. #include< ...

  4. 【代码源 Div1 - 102】#323. 最长因子链(dp)

    problem solution 首先因为前一个数时候一个数的因子,所以最长因子链肯定是递增的,先从小到大排个序. 然后因为n的大小只有1000,考虑dp,转移可以双循环 记f[i]表示到第i个数为止 ...

  5. 【代码源 Div1 - 101】#61. 二分答案(贪心)

    problem solution 考虑贪心,肯定最先给最小的值加,加到跟次小一样,再给次小的加... 先sort,相邻对比,把坑补上,补不上跳出 #include<bits/stdc++.h&g ...

  6. 【8.8】代码源 - 【不降子数组游戏】【最长上升子序列计数(Bonus)】【子串(数据加强版)】

    #886. 不降子数组游戏 题意: 题解:(分块/三分) 代码源每日一题Div1 不降子数组游戏 思路:首先,先手选了一个点,后手必定要选 L,RL,RL,R 其中的一个,这样才能使分数最大.那么把我 ...

  7. 【8.6】代码源 - 【前缀集】【矩阵游戏】【谁才是最终赢家?】【放置多米诺骨牌】

    #930. 前缀集 题意:给定两个长为 n ( 1 ≤ n ≤ 5 × 1 0 5 ) n(1\leq n\leq 5\times 10^5) n(1≤n≤5×105) 的序列 a i , b i a ...

  8. E: 您必须在 sources.list 中指定代码源(deb-src) URI 解决办法

    PS:这篇是自己的笔记,用来自己查阅的,所以不是很通俗 今天遇到了如下问题: Q: "正在读取软件包列表--完成 E:您必须在 source.list中指定代码源(deb-src)URI&q ...

  9. LibreOJ #103. 子串查找

    二次联通门 : LibreOJ #103. 子串查找 /*LibreOJ #103. 子串查找kmp*/ #include <cstdlib> #include <cstring&g ...

最新文章

  1. GNU make manual 翻译(八十八)
  2. linux登oracle登陆不了,oracle: linux服务器本机不能登陆的解决
  3. SpringBoot中关于Shiro权限管理的整合使用
  4. JS中document对象 window对象
  5. 用strings命令查看kafka-log内容 过滤二进制编码
  6. 不用虚机不用Docker使用Azure应用服务部署ASP.NET Core程序
  7. 二、Linxu的目录结构
  8. 生产环境Nginx配置文件
  9. input复选框改变样式
  10. 刷新率调高,或高于60Hz闪屏,忽明忽暗,晃动问题
  11. 如何避免程序员的中年危机?
  12. dreamweavercc 数据库_Dreamweaver CC
  13. crmphp_PHP开源CRM-推荐几个
  14. ISO26262道路车辆功能安全标准-(1)适用范围
  15. [置顶]Ceph源码解析:PG peering
  16. 怎么使用百度更精准搜索?我来教你6个搜索引擎小技巧
  17. 解锁iPhone密码锁?
  18. sigmoid函数sigmoid求导
  19. 【无用之书】侦探小说的二十条规则
  20. 拯救者Y9000K2021H在ubuntu18.04安装显卡驱动

热门文章

  1. Java 高阶 —— try/catch
  2. 远程登录工具 —— filezilla(FTP vs. SFTP)、xshell、secureCRT
  3. 恒星演化 —— 恒星的一生
  4. cmd 命令行方式执行 matlab 脚本
  5. 机器学习基础(三十六)—— 非规整数据(值缺失、异常值)的处理
  6. 机器学习基础(十四)—— 统计计数、majority count 与其数学记号
  7. C 标准库 —— ctypes.h
  8. python零基础学习书-零基础学习python推荐几本书?
  9. python能做什么excel-python处理excel的优势是什么
  10. 自学python-python自学难吗