【代码源 Div1#103】子串的最大差 Codeforces - 817D,力扣2104,1900分
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=inmax−∑i=1n∑j=inmin,即对于每一段来说的最大值和最小值。
或者从贡献的角度考虑:对于一个数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分相关推荐
- 【代码源 Div1 - 109】#454. Minimum Or Spanning Tree(最小生成树,边权按位或,贪心,并查集) CF1624G
problem solution 题意:生成树的代价为他所有边的边权按位或得到的值,求最小生成树 贪心,一般来说,求 按位与 和 按位或 的最大值都可以从高往低逐位的贪心处理 对于当前位 b 而言,若 ...
- 【代码源 Div1 - 108】#464. 数数(主席树,区间比k小的数的个数)HDU4417
problem solution 主席树查询区间比k小的数的个数 建树之后直接在目标区间的主席树内将 H 作为挡板递归计数. #include<bits/stdc++.h> using n ...
- 【代码源 Div1 - 105】#451. Dis(倍增求LCA)
problem solution 给出 n 个点的一棵树,每个点有各自的点权,m 次询问两个点简单路径所构成点集的异或和. 直接在树上求LCA,把每个点权放进去预处理一下即可. #include< ...
- 【代码源 Div1 - 102】#323. 最长因子链(dp)
problem solution 首先因为前一个数时候一个数的因子,所以最长因子链肯定是递增的,先从小到大排个序. 然后因为n的大小只有1000,考虑dp,转移可以双循环 记f[i]表示到第i个数为止 ...
- 【代码源 Div1 - 101】#61. 二分答案(贪心)
problem solution 考虑贪心,肯定最先给最小的值加,加到跟次小一样,再给次小的加... 先sort,相邻对比,把坑补上,补不上跳出 #include<bits/stdc++.h&g ...
- 【8.8】代码源 - 【不降子数组游戏】【最长上升子序列计数(Bonus)】【子串(数据加强版)】
#886. 不降子数组游戏 题意: 题解:(分块/三分) 代码源每日一题Div1 不降子数组游戏 思路:首先,先手选了一个点,后手必定要选 L,RL,RL,R 其中的一个,这样才能使分数最大.那么把我 ...
- 【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 ...
- E: 您必须在 sources.list 中指定代码源(deb-src) URI 解决办法
PS:这篇是自己的笔记,用来自己查阅的,所以不是很通俗 今天遇到了如下问题: Q: "正在读取软件包列表--完成 E:您必须在 source.list中指定代码源(deb-src)URI&q ...
- LibreOJ #103. 子串查找
二次联通门 : LibreOJ #103. 子串查找 /*LibreOJ #103. 子串查找kmp*/ #include <cstdlib> #include <cstring&g ...
最新文章
- GNU make manual 翻译(八十八)
- linux登oracle登陆不了,oracle: linux服务器本机不能登陆的解决
- SpringBoot中关于Shiro权限管理的整合使用
- JS中document对象 window对象
- 用strings命令查看kafka-log内容 过滤二进制编码
- 不用虚机不用Docker使用Azure应用服务部署ASP.NET Core程序
- 二、Linxu的目录结构
- 生产环境Nginx配置文件
- input复选框改变样式
- 刷新率调高,或高于60Hz闪屏,忽明忽暗,晃动问题
- 如何避免程序员的中年危机?
- dreamweavercc 数据库_Dreamweaver CC
- crmphp_PHP开源CRM-推荐几个
- ISO26262道路车辆功能安全标准-(1)适用范围
- [置顶]Ceph源码解析:PG peering
- 怎么使用百度更精准搜索?我来教你6个搜索引擎小技巧
- 解锁iPhone密码锁?
- sigmoid函数sigmoid求导
- 【无用之书】侦探小说的二十条规则
- 拯救者Y9000K2021H在ubuntu18.04安装显卡驱动
热门文章
- Java 高阶 —— try/catch
- 远程登录工具 —— filezilla(FTP vs. SFTP)、xshell、secureCRT
- 恒星演化 —— 恒星的一生
- cmd 命令行方式执行 matlab 脚本
- 机器学习基础(三十六)—— 非规整数据(值缺失、异常值)的处理
- 机器学习基础(十四)—— 统计计数、majority count 与其数学记号
- C 标准库 —— ctypes.h
- python零基础学习书-零基础学习python推荐几本书?
- python能做什么excel-python处理excel的优势是什么
- 自学python-python自学难吗