当前位置: 首页 > news >正文

UVa 12572 RMQ Overkill

题目描述

给定一个长度为NNN1≤N≤100001 \leq N \leq 100001N10000)的非负整数序列,每个元素的值小于101010。对于所有满足0≤i≤j<N0 \leq i \leq j < N0ij<N的子区间(i,j)(i, j)(i,j),求出该区间的最小值,然后将所有这些最小值求和,最后对100000000710000000071000000007取模输出。

输入包含多组测试用例(不超过120120120组),每组用例第一行是NNN,第二行是一个长度为NNN的数字字符串。

样例分析

样例输入

3 143 3 413 3 121

样例输出

13 11 7

以第一个样例143为例:

  • 子区间(0,0)(0,0)(0,0)最小值111
  • 子区间(0,1)(0,1)(0,1)最小值111
  • 子区间(0,2)(0,2)(0,2)最小值111
  • 子区间(1,1)(1,1)(1,1)最小值444
  • 子区间(1,2)(1,2)(1,2)最小值333
  • 子区间(2,2)(2,2)(2,2)最小值333

总和=1+1+1+4+3+3=13= 1 + 1 + 1 + 4 + 3 + 3 = 13=1+1+1+4+3+3=13

题目分析

直接做法的复杂度

最直接的想法是枚举所有子区间,对每个子区间扫描求最小值。子区间的数量为:

N(N+1)2\frac{N(N+1)}{2}2N(N+1)

N=10000N = 10000N=10000时,子区间数量约为5×1075 \times 10^75×107,对每个区间求最小值又会增加O(N)O(N)O(N)的时间,显然会超时。

核心思路:贡献计数法

我们不能枚举区间,而应该换个角度:枚举每个元素,计算它作为最小值出现在多少个区间中

对于位置iii上的元素a[i]a[i]a[i],如果我们可以知道:

  • 向左最多能延伸到多远,使得a[i]a[i]a[i]仍然是该区间的最小值
  • 向右最多能延伸到多远,使得a[i]a[i]a[i]仍然是该区间的最小值

那么包含iii且以a[i]a[i]a[i]为最小值的子区间数量 = (左侧可延伸长度) × (右侧可延伸长度)。

边界处理技巧(去重)

当数组中有相同元素时,需要小心处理,避免同一个区间的最小值被重复计算。

常用策略

  • 向左找第一个严格小于a[i]a[i]a[i]的元素(遇到相等的就停下)
  • 向右找第一个小于等于a[i]a[i]a[i]的元素(遇到相等的继续)

这样每个子区间的最小值只会被最左边那个最小值元素统计到,保证不重不漏。

图解说明

假设数组为[2, 5, 3, 3, 1],考虑中间的333(下标222):

下标:01234:25331
  • 向左找第一个严格小于333的元素:下标000222,所以左边界是000(实际左侧延伸从111开始)
  • 向右找第一个小于等于333的元素:下标444111,所以右边界是444(实际右侧延伸到333

那么包含下标222且以333为最小值的区间:

  • 左端点可选:1,21, 21,2(共222种)
  • 右端点可选:2,32, 32,3(共222种)
  • 总区间数=2×2=4= 2 \times 2 = 4=2×2=4

验证:(1,2)(1,2)(1,2)(1,3)(1,3)(1,3)(2,2)(2,2)(2,2)(2,3)(2,3)(2,3)最小值都是333

高效算法:单调栈

单调栈可以在O(N)O(N)O(N)时间内找到每个元素左右两侧第一个比它小(或小等于)的元素位置。

算法步骤

  1. 左侧扫描:维护一个单调递增栈(栈底到栈顶递增),找左边第一个严格小于当前元素的位置
  2. 右侧扫描:维护一个单调递增栈,找右边第一个小于等于当前元素的位置
  3. 计算贡献:对每个iii,累加a[i]×(i−left[i])×(right[i]−i)a[i] \times (i - left[i]) \times (right[i] - i)a[i]×(ileft[i])×(right[i]i)
  4. 取模:对109+710^9+7109+7取模

时间复杂度

  • 每个元素入栈出栈各一次,O(N)O(N)O(N)
  • 总复杂度O(N)O(N)O(N),可以轻松应对N=10000N=10000N=10000120120120组数据

完整代码

// RMQ Overkill// UVa ID: 12572// Verdict: Accepted// Submission Date: 2026-05-21// UVa Run Time: 0.010s//// 版权所有(C)2026,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;constintMOD=1000000007;intmain(){ios::sync_with_stdio(false);cin.tie(0);intn;string s;while(cin>>n>>s){// 将字符数组转换为整数数组vector<int>a(n);for(inti=0;i<n;++i)a[i]=s[i]-'0';vector<int>left(n),right(n);stack<int>st;// 第一步:找左边第一个严格小于 a[i] 的位置for(inti=0;i<n;++i){while(!st.empty()&&a[st.top()]>=a[i])st.pop();left[i]=st.empty()?-1:st.top();st.push(i);}// 清空栈,准备右侧扫描while(!st.empty())st.pop();// 第二步:找右边第一个小于等于 a[i] 的位置for(inti=n-1;i>=0;--i){while(!st.empty()&&a[st.top()]>a[i])st.pop();right[i]=st.empty()?n:st.top();st.push(i);}// 第三步:累加每个元素作为最小值的贡献longlongans=0;for(inti=0;i<n;++i){longlongcnt=(longlong)(i-left[i])*(right[i]-i);ans=(ans+a[i]*cnt)%MOD;}cout<<ans<<'\n';}return0;}

总结

方法时间复杂度空间复杂度是否可行
暴力枚举O(N3)O(N^3)O(N3)O(1)O(1)O(1)❌ 超时
预处理区间最小值O(N2)O(N^2)O(N2)O(N2)O(N^2)O(N2)❌ 内存超限
单调栈贡献计数O(N)O(N)O(N)O(N)O(N)O(N)✅ 完美通过

本题的核心技巧是“贡献计数”“单调栈”的结合。通过将问题从“枚举所有区间”转化为“统计每个元素作为最小值的次数”,再利用单调栈快速找到左右边界,成功将复杂度降至线性。

这种思维方式在区间最值相关问题中非常常见,例如“直方图最大矩形”“所有子数组最小值之和”等经典题目都使用了类似的思想。

http://www.jsqmd.com/news/861246/

相关文章:

  • 自指系统与算术障碍的跨领域猜想:封闭认知框架下的几何-物理-计算统一理论研究(世毫九实验室原创研究)
  • Token销毁机制深度解析:从原理到实战,开发者必读指南
  • 【仅限西北开发者内部流通】ElevenLabs陕西话语音微调秘钥+定制音色包(含西安/榆林/延安三地口音模型)
  • Rust分布式系统最佳实践:构建高可用、高性能的后端服务
  • 【编号884】江西省各城市-春节人口迁徙规模数据(2019-2025)
  • 福建话TTS落地难?手把手教你绕过ElevenLabs官方未公开的闽东方言/莆仙话语音注入方案,限时可复现
  • 嵌入式测试学习第 16 天:复位电路、电源电路基础原理
  • UVa 250 Pattern Matching Prelims
  • 【编号938】东南沿海诸河流域边界+东南沿海诸河流域水系矢量多级水系
  • 边缘AI框架:在边缘设备上运行AI模型
  • cursor-vip:当AI编程工具遇上共享经济,你的代码从此有了智能伙伴
  • 16. 编译与构建工具
  • 2026电镀镍标牌技术全解析:镍标牌厂家/镍标牌定制/镍转印标/不锈钢标牌/家电标牌/枪瞄标牌/电动车标牌/电铸镍标牌/选择指南 - 优质品牌商家
  • Python微服务架构:从单体到分布式的演进
  • UVa 253 Cube Painting
  • 小数据下防止过拟合的四大策略,深度学习模型训练与开发
  • 带标注的螺丝、螺栓、垫圈缺陷识别数据集,包含缺陷里包含生锈和划痕,1291张图,支持yolo,coco json,voc xml,文末有模型训练代码。
  • 2026年5月新发布:量化评估天津别墅装修源头公司,诺亚方舟装饰集团实力解析 - 2026年企业推荐榜
  • VS Code 响应式网站手机界面预览全【简易】指南
  • 2026年空压机出租报价核心维度拆解与实操参考:空压机出租报价/进口空压机出租/长臂锚固钻机出租/低噪音空压机出租/选择指南 - 优质品牌商家
  • Python事件驱动架构:设计模式与实战
  • 受够了网盘限速?2026年更顺手的不限速同步盘选择
  • 超宽自锚式悬索桥模型修正与抗震可靠度分析【附仿真】
  • 2026年山地车定制厂家综合:途锐达凭何成为口碑之选? - 2026年企业推荐榜
  • 2026年4月超纯水设备企业推荐,10吨双级高纯水设备/高纯水设备/超纯水设备/软化水设备,超纯水设备采购渠道怎么选择 - 品牌推荐师
  • 图解人工智能(31)深度学习前沿
  • Python API网关:架构设计与实战
  • 国内靠谱5吨软化水设备怎么选?认准诚信老牌厂家不踩坑,中水回用设备/5吨软化水设备,软化水设备品牌哪家可靠 - 品牌推荐师
  • GanttProject终极指南:免费开源的项目管理工具完全攻略
  • 建筑数据驱动预测控制方法【附模型】