ABC234G Divide a Sequence 题解

题目来源

  • ABC234G

  • 洛谷

Description

给定长度为 n n n 的序列 { a n } \{a_n\} {an}。定义一种将 { a n } \{a_n\} {an} 划分为若干段的方案的价值为每段的最大值减去最小值的差的乘积。求所有划分方案的价值的总和并对 998244353 998244353 998244353 取模。

  • 1 ≤ n ≤ 3 × 1 0 5 , 1 ≤ a i ≤ 1 0 9 1\le n\le3\times10^5,1\le a_i\le10^9 1n3×105,1ai109

Solution

由于要求所有划分方案的总和,并且难以存储划分的具体方案,因此我们可以通过动态规划来避免对具体方案进行讨论。

同时,我们可以将求乘积的和转化为将之前求出的和乘上同一个数。

具体而言,若设 f i f_i fi 表示 a 1 ⋯ i a_{1\cdots i} a1i 的划分方案价值之和,则:

f i = ∑ j = 1 i − 1 ( f j × ( max ⁡ k = j + 1 i { a k } − min ⁡ k = j + 1 i { a k } ) ) f_i=\sum_{j=1}^{i-1}\Bigg(f_j\times\Big(\max_{k=j+1}^{i}\{a_k\}-\min_{k=j+1}^i\{a_k\}\Big)\Bigg) fi=j=1i1(fj×(k=j+1maxi{ak}k=j+1mini{ak}))

但这么做效率显然不优,而我们又可以将 max ⁡ \max max min ⁡ \min min 分为两个独立的问题进行处理,于是我们应考虑分别计算 Maxsum i = ∑ j = 1 i − 1 ( f j × max ⁡ k = j + 1 i { a k } ) \text{Maxsum}_i=\sum\limits_{j=1}^{i-1}\Big(f_j\times\max\limits_{k=j+1}^{i}\{a_k\}\Big) Maxsumi=j=1i1(fj×k=j+1maxi{ak}) 以及 Minsum i = ∑ j = 1 i − 1 ( f j × min ⁡ k = j + 1 i { a k } ) \text{Minsum}_i=\sum\limits_{j=1}^{i-1}\Big(f_j\times\min\limits_{k=j+1}^{i}\{a_k\}\Big) Minsumi=j=1i1(fj×k=j+1mini{ak}),则 f i = Maxsum i − Minsum i f_i=\text{Maxsum}_i-\text{Minsum}_i fi=MaxsumiMinsumi

由于 max ⁡ \max max min ⁡ \min min 的计算类似,接下来以 max ⁡ \max max 的相关计算为例。

可以观察到,若将 i i i 1 1 1 枚举到 n n n,每次 f j × max ⁡ k = j + 1 i { a k } f_j\times\max\limits_{k=j+1}^{i}\{a_k\} fj×k=j+1maxi{ak} 的变化是有限的。即 max ⁡ k = j + 1 i { a k } \max\limits_{k=j+1}^{i}\{a_k\} k=j+1maxi{ak} 只有一段会存在变化,而这一段一定是一个区间 [ x , i ) [x,i) [x,i),其中 x = max ⁡ t < i , a t > a i t x=\max\limits_{t<i,a_t>a_i}t x=t<i,at>aimaxt,可结合下图理解(只有黑色矩形所在的下标可能成为最大值,且其是最大值的区间在其前一个黑色矩形所在下标到它前一个下标之间,如红色区间所示)。

那么我们可以看出来这需要运用到单调栈,栈中储存的是黑色矩形所在下标,用于求出图片上面定义的 x x x 的值。而在同一个红色区间内,最大值不变,只需对 f i f_i fi 进行求和。因此,若设 fsum \text{fsum} fsum f f f 的前缀和函数,我们可以得到 Maxsum i = Maxsum x + ( fsum i − 1 − fsum x − 1 ) × a i \text{Maxsum}_i=\text{Maxsum}_x+(\text{fsum}_{i-1}-\text{fsum}_{x-1})\times a_i Maxsumi=Maxsumx+(fsumi1fsumx1)×ai,那么 max ⁡ \max max 就可以在 O ( n ) O(n) O(n) 求出, min ⁡ \min min 同理,单调栈的具体过程可参考代码。

Code

#include <bits/stdc++.h>
using namespace std;
const int p=998244353;
int n,a[300005],Max[300005],top,Maxsum[300005],Min[300005],top2,Minsum[300005],f[300005],fsum[300005];
int main(){
	scanf("%d",&n);
	for (int i=1;i<=n;i++) scanf("%d",&a[i]);
	f[0]=fsum[0]=1;
	for (int i=1;i<=n;i++){
		while (top&&a[i]>=a[Max[top]]) top--;
		while (top2&&a[i]<=a[Min[top2]]) top2--;
		if (top) Maxsum[i]=(Maxsum[Max[top]]+1ll*(fsum[i-1]-fsum[Max[top]-1]+p)%p*a[i]%p)%p;
		else Maxsum[i]=1ll*fsum[i-1]*a[i]%p;
		if (top2) Minsum[i]=(Minsum[Min[top2]]+1ll*(fsum[i-1]-fsum[Min[top2]-1]+p)%p*a[i]%p)%p;
		else Minsum[i]=1ll*fsum[i-1]*a[i]%p;
		f[i]=(Maxsum[i]-Minsum[i]+p)%p,fsum[i]=(fsum[i-1]+f[i])%p;
		Max[++top]=i,Min[++top2]=i;
	}
	printf("%d\n",f[n]);
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/744218.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue3 使用 Vue Router 时,params 传参失效

前言&#xff1a; 在写项目的时候&#xff0c;使用了 vue-router 的 params 进行传参&#xff0c;但是在详情页面中一直获取不到参数。原因&#xff1a;Vue Router 在2022-8-22的那次更新后&#xff0c;使用这种方式在新页面上无法获取&#xff01; 正文&#xff1a; 在列表页进…

从零开始做题:老照片中的密码

老照片中的密码 1.题目 1.1 给出图片如下 1.2 给出如下提示 这张老照片中的人使用的是莫尔斯电报机&#xff0c;莫尔斯电报机分为莫尔斯人工电报机和莫尔斯自动电报机&#xff08;简称莫尔斯快机&#xff09;。莫尔斯人工电报机是一种最简单的电报机&#xff0c;由三个部分组…

【笔记】从零开始做一个精灵龙女-拆uv阶段

目录 先回顾一下拆uv的基础流程吧 肩部盔甲分UV示例 手环UV部分 腰带UV部分 其它也差不多&#xff0c;需要删掉一半的就先提前删掉一半&#xff0c;然后把不需要的被遮挡的面也删掉 龙角UV 胸甲UV 侧边碎发UV 马尾UV 脸部/耳朵UV 特殊情况&#xff1a;如果要删一半再…

kafka的命令行操作

kafka-topics.bat 该命令行和主题相关 kafka启动后&#xff0c;默认端口为9092,可修改 找到kafka_2.13-3.6.2\bin\windows目录下的kafka-topics.bat&#xff0c;用cmd执行 按下会有提示&#xff0c;REQURIED代表为必输项 创建topic 创建一个名为test的topic队列 kafka-t…

绘制图形

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在前3节的实例中&#xff0c;我们一直绘制的都是直线&#xff0c;实际上&#xff0c;海龟绘图还可以绘制其他形状的图形&#xff0c;如圆形、多边形等…

FineReport聚合报表与操作

一、报表类型 模板设计是 FineReport 学习过程中的主要难题所在&#xff0c;FineReport 模板设计主要包括普通报表、聚合报表、决策报表三种设计类型。 报表类型简介- FineReport帮助文档 - 全面的报表使用教程和学习资料 二、聚合报表 2-1 介绍 聚合报表指一个报表中包含多个…

STM32的SPI通信

1 SPI协议简介 SPI&#xff08;Serial Peripheral Interface&#xff09;协议是由摩托罗拉公司提出的通信协议&#xff0c;即串行外围设备接口&#xff0c;是一种高速全双工的通信总线。它被广泛地使用在ADC、LCD等设备与MCU间&#xff0c;使用于对通信速率要求较高的场合。 …

扩散模型 GLIDE:35 亿参数的情况下优于 120 亿参数的 DALL-E 模型

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…

LeetCode 算法:二叉树的层序遍历 c++

原题链接&#x1f517;&#xff1a;二叉树的层序遍历 难度&#xff1a;中等⭐️⭐️ 题目 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;roo…

TensorFlow开源项目

欢迎来到 Papicatch的博客 文章目录 &#x1f349;TensorFlow介绍 &#x1f349;主要特点和功能 &#x1f348;多语言支持 &#x1f348;灵活的架构 &#x1f348;分布式训练 &#x1f348;跨平台部署 &#x1f348;强大的工具链 &#x1f348;丰富的社区和生态系统 &a…

人工智能与物联网:融合创新驱动未来

引言 人工智能&#xff08;AI&#xff09;指的是计算机系统模拟人类智能的能力&#xff0c;包括学习、推理、问题解决、理解自然语言以及感知和响应环境的能力。AI技术涵盖了机器学习、深度学习、神经网络、自然语言处理等领域&#xff0c;广泛应用于图像识别、语音识别、自动驾…

FPGA学习笔记(5)——硬件调试与使用内置的集成逻辑分析仪(ILA)IP核

如果要对信号进行分析&#xff0c;可以使用外置的逻辑分析仪&#xff0c;但成本较高&#xff0c;对初学者来说没有必要&#xff0c;可以使用Xilinx Vivado内自带的逻辑分析仪IP核对信号进行分析&#xff0c;不过需要占用一定的芯片资源。 本节采用上一节配置的LED灯闪烁代码&a…

如何改善老年人的行走姿势以减少小碎步现象?

改善老年人行走姿势的方法 为了改善老年人的行走姿势并减少小碎步现象&#xff0c;可以采取以下几种方法&#xff1a; 平衡训练&#xff1a;通过使用单脚站立架、平衡板等器械&#xff0c;提高身体稳定性和协调性&#xff0c;增强核心稳定性及下肢肌肉力量&#xff0c;从而改善…

数据结构-顺序表的交换排序

顺序表的初始化 const int M 505;typedef struct{int key; //关键元素int others; //其他元素 }info;typedef struct{info r[M1]; int length(); //表长 }SeqList,*PSeqList; 冒泡排序 分析&#xff1a; 顺序表的冒泡排序和数组的冒泡排序的…

STM32定时器入门篇——(基本定时器的使用)

一、基本定时器的功能介绍&#xff1a; STM32F103的基本定时器有&#xff1a;TIM6、TIM7。基本定时器TIM6和TIM7各包含一个16位递增自动装载计数器&#xff0c;最大计数到2^16也就是65536&#xff0c;计数值为0~65535&#xff0c;其拥有的功能有&#xff1a;定时中断、主模式触…

深度学习21-30

1.池化层作用&#xff08;筛选、过滤、压缩&#xff09; h和w变为原来的1/2&#xff0c;64是特征图个数保持不变。 每个位置把最大的数字取出来 用滑动窗口把最大的数值拿出来&#xff0c;把44变成22 2.卷积神经网络 &#xff08;1&#xff09;conv&#xff1a;卷积进行特征…

Elasticsearch 数据提取 - 最适合这项工作的工具是什么?

作者&#xff1a;来自 Elastic Josh Asres 了解在 Elasticsearch 中为你的搜索用例提取数据的所有不同方式。 对于搜索用例&#xff0c;高效采集和处理来自各种来源的数据的能力至关重要。无论你处理的是 SQL 数据库、CRM 还是任何自定义数据源&#xff0c;选择正确的数据采集…

【Excel】单元格如何设置可选项、固定表头

设置可选项 固定表头&#xff1a;视图---冻结窗口

SD-WAN带宽对使用的影响及如何规划

SD-WAN&#xff08;软件定义广域网&#xff09;是一种创新技术&#xff0c;旨在优化和提升企业网络的性能、可靠性和安全性。带宽在SD-WAN的使用中起着关键作用&#xff0c;而确定SD-WAN专线所需的带宽大小需要综合考虑多个因素。本文将深入探讨SD-WAN带宽对使用的影响以及如何…

试析C#编程语言的特点及功能

行步骤&#xff0c;而不必创建新方法。其声明方法是在实例化委托基础上&#xff0c;加一对花括号以代表执行范围&#xff0c;再加一个分号终止语句。 2.3.3 工作原理 C#编译器在“匿名”委托时会自动把执行代码转换成惟一命名类里的惟一命名函数。再对存储代码块的委托进行设…