题目链接:点击查看

题目大意:给出一段连续数列,在给出m个询问,要求按照给出的函数查询得到结果

题目分析:第一眼一看题目会觉得是个递归题目,但是盲目递归肯定会TLE,所以我们要分析这个题目到底要干什么,这个题目其实就是问在闭区间[l,r]内,一开始数字为a[l],然后依次对a[l+1]到a[r]取模,即连续取模,分析了半天发现也没有什么性质,但是却发现了一个小技巧,就是当一个数取模时,如果模比这个数要大的话,那对这个数是没有影响的,只有当模小于等于这个数的时候取模才是有意义的,所以我们可以将连续取模优化为每次找到一个比当前结果要小于等于的数再进行取模,类似于跳着取模,这样就能将时间复杂度大大降低,所以我们可以用线段树来存储区间内的最小值,这样在查询的时候就可以优先查询左区间,这样就可以同时满足“第一个”和“比当前数字小”这两个条件了。不过我线段树还是菜啊,自己埋着头调了一个小时也没调好那个查询函数,总是有点小bug,转念一想,想起来好像就是要查找右边第一个小的数字,那么能不能用单调栈莽一下,因为单调栈的主要用处就是用o的时间复杂度来存储左边或右边第一个比当前数字大或小的位置,有了这样一个剪枝,虽然最后每次取模的次数相对于线段树来说会增多,但相对于暴力比较来说还是快了不少呢,毕竟也是跳着取模。。而且最后事实也说明了,数据没有那种特别恶心的,单调栈跑出来的还是比线段树快啊,因为单调栈的时间复杂度是n,此后查询时间复杂度就变为了1,这样在遍历一遍每个区间,总的时间复杂度稍大于n+m吧,因为每次查询虽然是要跳着查询,但还是会找很多次。。但线段树的话,建树nlogn,每次查询也是logn,最坏的查询也是logn*logn,所以时间复杂度是nlogn+nlogn*logn,搭眼一看,一般数据来说肯定是单调栈更快一点,但是特殊数据可能会卡。。不过谢天谢地这个题目没有出那种恶心人的数据。

直接上代码了,单调栈好久没用了,从网上复制的板子:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<cmath>
#include<set>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;int a[N];int id[N];int main()
{
//    freopen("input.txt","r",stdin)int w;cin>>w;while(w--){int n,m;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",a+i);stack<int>s;for(int i=n;i>=1;i--){while(!s.empty()&&a[s.top()]>a[i])//单调栈{s.pop();}if(s.empty())id[i]=-1;elseid[i]=s.top();s.push(i);}scanf("%d",&m);while(m--){int x,y;scanf("%d%d",&x,&y);if(x==y){printf("%d\n",a[x]);}else{int ans=a[x];while(1){int pos=id[x];if(pos==-1||pos>y)break;ans%=a[pos];x=pos;}printf("%d\n",ans);}}}return 0;
}

HDU - 5875 Function(单调栈)相关推荐

  1. HDU - 5875 Function [单调性剪枝+预处理]

    2016大连网络赛 H题 传送门:HDU - 5875 Function Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 262144/262 ...

  2. HDU多校4 - 6989 Didn‘t I Say to Make My Abilities Average in the Next Life?!(单调栈)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,再给出 mmm 次询问,每次询问给出一个区间 [l,r][l,r][l,r],要求输出区间 [l,r][l,r][l,r] 内 " ...

  3. HDU 6194 后缀数组+单调栈

    题意: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6194 找到一个字符串中恰好出现k次的子串的数目. 思路: 计算出height数组,根据heig ...

  4. HDU 1506 解题报告 Largest Rectangle in a Histogram (单调栈)

    看题传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1506 题意比较明显,就是找以某一个矩形为高的最大的矩形.这个题可以用单调栈来求解,需要注意的是如果从 ...

  5. 数据结构 单调栈+几何 摩天大楼【HDU 5033 】

    HDU 5033 题目大意: 就是一个人来到充满摩天大楼的城市,所有大楼没有宽度.建一直角坐标系,给出每个建筑的高度,现在求人站在(x,0)处能够看到天空的范围.(即不被摩天大楼阻挡).答案只需要给出 ...

  6. HDU 6052 To my boyfriend(容斥+单调栈)

    题意:对于一个n*m的方格,每个格子中都包含一种颜色,求出任意一个矩形包含不同颜色的期望. 思路: 啊啊啊啊啊,补了两天,总算A了这道题了,简直石乐志,前面的容斥还比较好写,后面的那个>13那个 ...

  7. hdu 1506(dp || 单调栈)

    题意:这题是要找最大的矩形面积. 解题思路:这题的关键是要找每个条形能够往左和往右能够到达的最大长度.我最开始的思路是单调栈去维护,只要入栈的元素比栈顶元素小,栈顶就要出栈,并且知道其最右能够到达的最 ...

  8. hdu 4252(单调栈)

    题意:一张相片上的很多建筑相互遮住了,根据高低不同就在相片上把一座高楼的可见部分作为一个矩形,并用数字描述其高度,若一张相片上的两个建筑群中间有空地,高度则为0;求最少有多少个建筑; 解题思路:这道题 ...

  9. HDU 1506 Largest Rectangle in a Histogram(dp、单调栈)

    你是不是飘了?骚年! Problem Description A histogram is a polygon composed of a sequence of rectangles aligned ...

最新文章

  1. 支持向量机SVM模型中C和gamma参数分别是什么?对模型有什么影响?
  2. 4节点近160万IOPS:SDS/超融合测试不能只看数字
  3. iOS开发debug集锦
  4. android x86一键安装,安卓
  5. 实时操作系统主流调度方法RMS
  6. AutoValue:生成的不可变值类
  7. 无名管道pipe使用方法
  8. 在delphi中如何动态建立类的实例
  9. 果然十三香!苹果全球销量超越小米重回第二,第一还是它
  10. oracle11环境变量path设置_LUENT软件UDF环境变量配置
  11. espresso 2.0.4 Apple Xcode 4.4.1 coteditor 价格
  12. XManager连接CentOS6.5
  13. 项目拉去某个版本的_项目管理的“背后军师”——高层领导
  14. W25Q64 Flash芯片原理与应用方案(含W25Q64中文数据手册)
  15. 商业计划书(BP)应该包含哪些点?看 BP 的人最想从中得到什么?
  16. arcgis api for javascript 3.33 清空、删除图层
  17. 非香农类信息不等式_信息论
  18. 无线路由器dhcp服务器连接失败,TP-Link路由器桥接提示“获取IP地址失败,请检查DHCP是否开启”怎么办...
  19. J2EE:赛迪网J2EE视频总结
  20. python cookies是什么_Python获取cookie有什么用

热门文章

  1. 防重 Token 令牌如何实现幂等性?
  2. 修改用户和用户组权限
  3. flume案例-网络数据采集-启动flume
  4. 元素的选中问题 元素选中的问题 切换复选框选中 全选和全不选
  5. exi 虚拟服务器,图文教程:如何在ESXi主机上部署VMware Tools 10
  6. php如何获取百度快照,PHP获取某网站的百度快照日期方法
  7. mysql导入多条数据语句_MySQL插入多条记录和REPLACE语句
  8. Spring--IoC(1)
  9. 简易 IM 双向通信电脑端 GUI 应用——基于 Netty、JavaFX、多线程技术等
  10. 200819C阶段一C++面向对象的编程思想