P3246 [HNOI2016] 序列 题解

news/2025/2/26 21:09:34/文章来源:https://www.cnblogs.com/laoshan-plus/p/18739699

P3246 [HNOI2016] 序列

直到最后一步都是容易想到的,而最后一步恰是本题的关键所在。

首先看到 ST 表和莫队是容易想到的,那么有了莫队就应该考虑如何扩展区间。我们尝试把 \([l,r]\) 扩展到 \([l,r+1]\),发现需要知道 \(\min[l,r],\min[l+1,r],\dots,\min[r,r]\)。这个东西直接做显然是不好做的,但是由于它显然具有单调性,考虑如果我们求出了每个值作为区间最小值的区间,应该就能求出答案。

单调栈应该就有了。

但每次扩展的时候都跑一遍单调栈显然不现实,那么我们先预处理 \(\text{lf}(i)\)\(\text{rf}(i)\) 分别表示 \(a_i\) 作为区间最小值的区间左端点和右端点,这个显然一正一反两遍单调栈就能 \(O(n)\) 求出。但我们还是不知道如何求解答案。考虑一个区间 \([l,r]\) 扩展到 \([l,r+1]\)\([l,r+1]\) 的最小值 \(a_p\) 能提供贡献的区间左端点为 \([l,p]\),那么它能提供的贡献显然是 \(a_p\times(p-l+1)\),考虑求剩下这部分的贡献。

下面是核心内容。考虑设一个 \(f_{l,r}\) 表示以 \(r\) 为右端点、左端点在 \([l,r]\) 区间内的答案,利用我们刚才求出的 \(\text{lf}(i)\) 可以得到转移:\(f_{l,r}=f_{l,\text{lf}(i)}+a_r\times(r-\text{lf}(r))\)。发现和 \(l\) 无关,于是自然可以去掉 \(l\) 这一维,于是我们发现这个东西是可以预处理的。所以上面所说 “剩下这部分的贡献” 就是 \(f_r-f_p\)

于是这题就做完了。

using ll=long long;
constexpr int MAXN=1e5+5;
int n,Q,t,F,logn[MAXN],f[MAXN][21];
int lf[MAXN],rf[MAXN],stk[MAXN],top;
ll a[MAXN],sml[MAXN],smr[MAXN],ans[MAXN];
struct Ask{int l,r,id;bool operator<(const Ask&x)const{return l/t!=x.l/t?l<x.l:l/t&1?r<x.r:r>x.r;}
}q[MAXN];void ST(){for(int j=1;j<=F;j++)for(int i=1;i+(1<<j)-1<=n;i++)f[i][j]=Min(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
int amn(int l,int r){int s=logn[r-l+1];return Min(f[l][s],f[r-(1<<s)+1][s]);
}
ll gtl(int l,int r){int mn=amn(l,r);return a[mn]*(r+1-mn)+smr[l]-smr[mn];
}
ll gtr(int l,int r){int mn=amn(l,r);return a[mn]*(mn-l+1)+sml[r]-sml[mn];
}int main(){n=read(),Q=read();F=__lg(n),t=sqrt(n);a[0]=a[n+1]=-2e9,logn[0]=-1;for(int i=1;i<=n;i++){a[i]=read();logn[i]=logn[i>>1]+1;f[i][0]=i;while(top&&a[stk[top]]>=a[i]) top--;lf[i]=stk[top];sml[i]=sml[lf[i]]+a[i]*(i-lf[i]);stk[++top]=i;}stk[top=1]=n+1;for(int i=n;i;i--){while(top&&a[stk[top]]>=a[i]) top--;rf[i]=stk[top];smr[i]=smr[rf[i]]+a[i]*(rf[i]-i);stk[++top]=i;}ST();for(int i=1;i<=Q;i++) q[i]={read(),read(),i};sort(q+1,q+Q+1);ll cnt=0;for(int i=1,l=1,r=0;i<=Q;i++){while(l>q[i].l) cnt+=gtl(--l,r);while(r<q[i].r) cnt+=gtr(l,++r);while(l<q[i].l) cnt-=gtl(l++,r);while(r>q[i].r) cnt-=gtr(l,r--);ans[q[i].id]=cnt;}for(int i=1;i<=Q;i++) write(ans[i]);return fw,0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins详解教程

1.介绍2.Jenkins CI/CD 流程3.部署Jenkins查看初始密码4 使用Jenkins

Redis概述安装与基本数据类型

Redis概述安装与基本数据类型 1. 什么是NoSQL NoSQL( Not Only SQL ),意即不仅仅是SQL, 泛指非关系型的数据库。Nosql这个技术门类,早期就有人提出,发展至2009年趋势越发高涨。 2. NoSQL的广泛应用 随着大数据的兴起,数据量的暴增,数据类型的丰富,传统的关系数据库在应付动…

Hello! I am Zhan Yijue,nice to meet you

这个作业属于哪个课程 23软件工程这个作业要求在哪里 【作业1】自我介绍+软工5问这个作业的目标 学习使用 Markdown, 熟练掌握 GitHub 及 Git 的使用方法, 建立个人博客个人介绍 ❤️ 兴趣爱好听歌 🎧 书法📝 看书,尤其是科幻小说 📊 二次元爱好者 🎩📖 学习经历广东…

Hugging Face 发布 Python WebRTC 库:构建实时音视频应用;微软 Magma:多模态跨数字物理世界丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看点的 活动 」,但内容仅代表编辑…

1Panel 专业版评测:全面超越宝塔的运维面板新标杆

一、 UX体验与移动端适配:更直观的跨平台交互 1Panel 专业版在用户体验上实现了对宝塔的全面超越。其界面采用现代化设计语言,以黑金主题 为代表的可定制化主题系统支持一键切换,视觉风格更符合技术审美,同时保持功能模块的清晰布局。相较于宝塔复杂的多级菜单,1Panel 的 …

基于抖音agent平台Cozi打造Agent智能体

AI Agent 一、AI Agent(智能体)与开发平台 【1】AI Agent的概念 AI Agent直接翻译更准确,AI代理人。AI Agent是指可以自主执行任务或目标的系统,它可以是一个软件,也可以是一个智能机器,这些系统通过感知环境并在此基础上做出决策。AI Agent可以集成多种技术,包括AI大模…

纯离线部署本地知识库LLM大模型

纯离线部署本地知识库LLM大模型 一、下载离线大模型下载的网址:https://hf-mirror.com/deepseek qwen 相关的模型,只建议使用1.5B的,GGUF后缀的模型 推荐下载llama相关模型,同样是GGUF后缀的,自己笔记本电脑推荐下载8B的 二、下载大模型管理平台 LM Studio下载网址:https…

mailto链接

本文主要内容转载自Haorooms!好用的mailto网站话不多说直接上正菜! 大佬dawsbot提供的工具mailto.vercel.app前言 今天看到老外写的一篇关于mailto: HTML e-mail 的文章,感觉很新奇,以前从来没有这么用过,用email的时候,最多用过mailto,但是其中穿链接参数,还是第一次看…

二次开发(第一周作业)

(1) 来源 C++ 大作业 超市收银系统 - shugen - 博客园 该文章介绍了一个软件的实现过程,并提供了相关代码。通过对该软件的分析对其进行了改进和二次开发。 (2) 运行环境+运行结果的截图(伸缩代码附上) 操作系统:Windows 11 开发工具:Dev-c++ 编程语言:C++ 运行结果截…

iconfont本地引入

本地引入iconfont的好处 Butterfly主题自带的Font Awesome图标库免费版里有好多图标没有,而阿里巴巴的开源图标iconfont里的图标非常丰富,所以可以同时引入一下iconfont图标作为Font Awesome图标库的补充。 考虑到在线引入的icon图标大小都是16x16的,而Font Awesome图标一般…

powershell-alias配置方案

最近实在被git命令和poetry命令搞烦了,每次都要输入好长的命令,并且都差不太多,所以就搜索了怎么配置alias,下面是我的配置过程,主要资料来自[1]。配置 因为我用的是Windows Terminal,主要使用的Powershell环境,所以一下教程主要是以Powershell为例,配置的Alias主要是关…

leetcode hot 13

解题思路:本题思路主要是前缀和思想,涉及到子集和问题,前缀和思想有效,两个前缀和的差就等于对应一个子集和。本题可以用哈希表的方式记录每个前缀和的值,核心依靠k = pre[j]-pre[i]转化成pre[j]-k=pre[i],计算pre[i]这个值出现的个数加到res中,最后返回。 class Solutio…