ABC234G Divide a Sequence 题解

news2024/11/16 5:32:35

题目来源

  • 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.coloradmin.cn/o/1860942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PA交易】BackTrader: 讨论下分析器和评测指标

前言 BackTrader的分析器主要使用的是analyzers模块&#xff0c;我们可以从Analyzers - Backtrader找到一个非常简单的示例。这个示例中使用方式很简单&#xff0c;其他分析器也可以通过如此简单封装方式进行装载。如果仅是复制粘贴官方教程&#xff0c;完全是制造互联网垃圾…

qt开发-14_QListwidget 仿qq好友列表制作

QListWidget 继承 QListView。QListWidget 类提供了一个基于项的列表小部件。QListWidg et 是一个便捷的类&#xff0c;它提供了一个类似于 QListView&#xff08;下一小节将讲到&#xff09;提供的列表视图&#xff0c;但 是提供了一个用于添加和删除项目的基于项目的经典接口…

Pycharm执行打印console中print数据打印显示不全的解决办法?

#设置显示窗口数据显示完整 pd.set_option(display.max_rows, 500) pd.set_option(display.max_columns, 100) pd.set_option(display.width, 1000)

API-事件类型

学习目标&#xff1a; 掌握事件类型 学习内容&#xff1a; 事件类型鼠标事件焦点事件键盘事件文本事件focus选择器案例 事件类型&#xff1a; 鼠标事件&#xff1a; <title>事件类型-鼠标事件</title><style>div {width: 200px;height: 200px;background-c…

three.js - 置换贴图(displacementMap)、凹凸贴图(bumpMap)、法线贴图(normalMap)

这就是个灰度图 瞅瞅下面的贴图们&#xff0c;加深一下印象吧 说一下灰度图 在灰度图中&#xff0c; 黑色&#xff1a;代表最低的深度&#xff08;或最低的置换&#xff09; 白色&#xff1a;代表最高的深度&#xff08;或最高的置换&#xff09; 中间的灰度值&#xff0c;则…

链在一起联机存档同步教程 教你如何学会链在一起联机同存档

双人成行&#xff0c;四人更行了&#xff0c;说的就是新游戏链在一起&#xff0c;多人合作冒险游戏&#xff0c;一个是和兄弟四人一起玩的游戏&#xff0c;游戏中四个人被铁链绑在一起&#xff0c;大型节目之好兄弟到底谁是脑瘫正在上演&#xff0c;甚至有些玩家感觉链子牵的不…

SAP消息号 VF028

客户在VF11冲销发票之后&#xff0c;没有生成正式的财务凭证&#xff0c;然后VF02的时候出现如下报错&#xff1a; “自动清算出具发票凭证XXXXXXX&#xff08;被冲销凭证号&#xff09;且不可能取消凭证XXXXXXX&#xff08;冲销凭证号&#xff09; 原因&#xff1a;销售订单2…

归并排序和计数排序

目录 1.归并排序1.1递归1.1基本思想1.2算法描述1.3画图解释1.4代码实现 1.2非递归 2.计数排序2.1基本思想2.2算法描述3.画图解释 1.归并排序 1.1递归 1.1基本思想 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法&#xff08;Divide and Conquer&#xf…

毫米波移动通信系统中的波束赋形—基于AOD估计的波束赋形

基于AOD估计的波束赋形依据压缩感知理论&#xff0c;利用毫米波信道的稀疏特性[18][19]&#xff0c;提出对信号的AOA和AOD进行估计&#xff0c;根据估计方向进行波束赋形。由于毫米波信道的稀疏特性&#xff0c;假设有L条多径分量时&#xff0c;公式1中的信道矩阵H可以表示为下…

软件质量保证与测试

目录 一、测试流程 二、测试用例 2.1概念 2.2用例编写格式 三、设计测试点 3.1等价类 3.1.1概念 3.1.2案例 3.1.3适用场景 3.1.4执行用例 3.2边界值 3.2.1概念 3.2.2案例 3.2.3使用场景 3.3判定表 3.3.1判定表使用原因 3.3.2概念 3.3.3案例 3.3.4使用场景 …

宏定义__FILE__,__LINE__,__VA_ARGS__等介绍与应用

ANSIC标准定义中常见的预定义宏 __LINE__&#xff1a;在源代码中插入当前源代码行号&#xff1b; __FILE__&#xff1a;在源代码中插入当前源代码路径及文件名&#xff1b; __DATE__&#xff1a;在源代码中插入当前编译日期&#xff1b; __TIME__&#xff1a;在源代码中插入…

全域运营系统是如何做好全平台运营?

当前&#xff0c;全域运营的热度持续上涨&#xff0c;多篇分析全域运营平台优缺点的帖子也在多个创业者交流群中风靡一时。综合来看&#xff0c;在众多的全域运营平台中&#xff0c;属后面我们说的这家全域运营平台的分析最为详尽。 其中&#xff0c;对于我们的全域运营平台的优…

Diffusion Mamba:用于CT到MRI转换的Mamba扩散模型

Diffusion Mamba&#xff1a;用于CT到MRI转换的Mamba扩散模型 提出背景拆解左侧&#xff1a;整体框架中间&#xff1a;Mamba块的细节右侧&#xff1a;螺旋扫描的细节 提出背景 论文&#xff1a;https://arxiv.org/pdf/2406.15910 代码&#xff1a;https://github.com/wongzbb…

macOS Sequoia 15 beta 2 (24A5279h) Boot ISO 原版可引导镜像下载 (iPhone Mirroring 现已支持)

macOS Sequoia 15 beta 2 (24A5279h) Boot ISO 原版可引导镜像下载 (iPhone Mirroring 现已支持) iPhone 镜像、Safari 浏览器重大更新、备受瞩目的游戏和 Apple Intelligence 等众多全新功能令 Mac 使用体验再升级 请访问原文链接&#xff1a;https://sysin.org/blog/macOS-…

有没有品质高的开放式蓝牙耳机推荐,这几款开放式耳机非常值得

随着科技的发展&#xff0c;越来越多的人选择开放式蓝牙耳机&#xff0c;对比传统的耳机&#xff0c;开放式蓝牙耳机可以提供更加自然的听觉体验&#xff0c;减少外部环境隔绝感&#xff0c;增强安全性&#xff0c;透气设计舒适度更高&#xff0c;也更加的干净卫生。深受运动爱…

如何挑选护眼灯?一分钟带你了解挑选护眼灯的六大准则!

小时候&#xff0c;对正确用眼知识一无所知&#xff0c;也不明白何种光线环境对眼睛最为友善&#xff0c;结果如今的近视度数已濒临千度大关。虽然早已习惯佩戴眼镜的生活&#xff0c;但近视所带来的诸多不便仍旧在日常生活中无处不在。因此&#xff0c;对于家中孩子的视力健康…

echarts+vue2实战(二)

目录 一、WebSocket【双向通信】的使用 1.1、前端 1.2、后端 二、前端组件的合并与优化 三、全屏切换 3.1、单页面切换 3.2、同页面多端联动 四、主题切换 4.1、单页面切换 4.2、同页面多端联动 一、WebSocket【双向通信】的使用 1.1、前端 在utils文件夹里创建soc…

【漏洞复现】华测监测预警系统——SQL注入漏洞

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 华测监测预警系统2.2版本存在sql注入&#xff0c;UserEdit接口S…

用构造函数为对象的数据成员实现输入和输出时间

在C程序中&#xff0c;对象的初始化是一个不可缺少的重要问题。不应该让程序员在这个问题上花过多的精力&#xff0c;C在类的设计中提供了较好的处理方法。 为了解决这个问题&#xff0c;C提供了构造函数&#xff08;constructor&#xff09;来处理对象的初始化。构造函…

【前端】HTML+CSS复习记录【1】

文章目录 前言一、p、br&#xff08;段落、换行&#xff09;二、短语标签&#xff08;用来呈现为被强调的文本&#xff09;三、sub、sup&#xff08;下标、上标&#xff09;四、b&#xff08;加粗文本&#xff09;五、块级元素与行内元素六、元素嵌套七、html注释系列文章目录 …