题目传送门(内部题124)


输入格式

  第一行一个整数$n$代表环的长度。
  第二行$n$个整数表示每个冰锥的高度。


输出格式

  一行一个整数表示有多少对冰锥是危险的。


样例

样例输入1:

5
1 2 4 5 3

样例输出1:

7

样例输入2:

3
7 7 7

样例输出2:

3


数据范围与提示

对于所有数据,满足$3\leqslant n\leqslant 5,000,000$,$0\leqslant$冰锥的高度$\leqslant 10^9$。
特殊性质$1$:高度是一个单调不降的序列
特殊性质$2$:不包含两个高度相同的冰锥
本题读入量较大,建议使用较快速的读入方式


题解

先来解释一下题意,应该是$i$或$j$的高度,而不是$i$和$j$的高度,样例$1$即为下图$\downarrow$

首先,有这么一个性质,对于一个冰锥,它对答案的贡献为它相邻的冰锥开始的一个不降序列的长度且不大于这个点的高度。

那么可以用单调栈维护。

再来处理第一个难点,环。

对于环的问题,直接将其复制一遍,而对于这道题,为了方便,直接从序列中最大的一个开始即可。

第二个难点,重复。

也不用担心,再开一个数组记录一下当前栈中每一个元素跟前面的元素有几个相同即可。

注意数据范围冰锥的高度其实是$2\times 10^9$即可。

这道题卡常,所以要使用$AE86$

时间复杂度:$\Theta(n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n;
  4. int a[10000001],sta[10000001],sam[10000001],mx,top;
  5. namespace ae86{
  6. const int bufl=1<<15;
  7. char buf[bufl],*s=buf,*t=buf;
  8. inline int fetch(){
  9. if(s==t){t=(s=buf)+fread(buf,1,bufl,stdin);if(s==t)return EOF;}
  10. return*s++;
  11. }
  12. inline int read(){
  13. int a=0,b=1,c=fetch();
  14. while(!isdigit(c))b^=c=='-',c=fetch();
  15. while(isdigit(c))a=a*10+c-48,c=fetch();
  16. return b?a:-a;
  17. }
  18. }
  19. using ae86::read;
  20. int main()
  21. {
  22. scanf("%d",&n);
  23. for(int i=1;i<=n;i++)
  24. {
  25. a[i+n]=a[i]=read();
  26. if(a[i]>a[mx])mx=i;
  27. }
  28. long long ans=0;
  29. for(int i=mx;i<mx+n;i++)
  30. {
  31. while(top&&sta[top]<a[i]){ans++;top--;}
  32. if(sta[top]>a[i])ans++;
  33. else ans+=sam[top]+(a[i]!=a[mx]);
  34. sta[++top]=a[i];
  35. sam[top]=(a[i]==sta[top-1]?sam[top-1]+1:1);
  36. }
  37. while(top>2)
  38. {
  39. if(sta[top]==sta[2])break;
  40. top--;ans++;
  41. }
  42. printf("%lld",ans);
  43. return 0;
  44. }

rp++

[CSP-S模拟测试]:你相信引力吗(单调栈)的更多相关文章

  1. 联赛模拟测试24 D. 你相信引力吗 单调栈

    题目描述 分析 因为跨过最大值的区间一定是合法的,所以我们人为地把最大值放在最左边 我们要统计的就是在最大值右边单调不降的序列,可以用单调栈维护 需要特殊处理相同的情况 代码 #include< ...

  2. 2018.11.02 NOIP模拟 优美的序列(数论+单调栈/链表)

    传送门 考虑如果一个区间满足最小值等于最大公约数那么这个区间是合法的. 因此我们对于每一个点维护可以延展到的最左/右端点保证这一段区间的gcdgcdgcd等于这个点的值. 这个可以用之前同类的链表或者 ...

  3. [CSP-S模拟测试]:Star Way To Heaven(最小生成树Prim)

    题目描述 小$w$伤心的走上了$Star\ way\ to\ heaven$. 到天堂的道路是一个笛卡尔坐标系上一个$n\times m$的长方形通道(顶点在$(0,0)$和$(n,m)$),小$w$ ...

  4. Android单元测试与模拟测试详解

    测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...

  5. [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)

    目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...

  6. 安装nginx python uwsgi环境 以及模拟测试

    uwsgi帮助文档: http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html http://uwsgi-docs.re ...

  7. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  8. 转 C#实现PID控制的模拟测试和曲线绘图

    C#实现PID控制的模拟测试和曲线绘图   本文分两部分,一部分是讲PID算法的实现,另一部分是讲如何用动态的曲线绘制出PID运算的结果. 首先,PID算法的理论模型请参考自动控制理论,最早出现的是模 ...

  9. Mockito:一个强大的用于Java开发的模拟测试框架

    https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...

随机推荐

  1. Dedesql数据库类详解(二次开发必备教程)

    其实数据库类织梦之前就有一个介绍,http://help.dedecms.com/v53/archives/functions/db/,这篇文章讲解了数据库类的一些常见的使用方法,不过没有结合例子去介 ...

  2. 数据库or、in、<>、>=、<=、butween区别

    操作前先关闭数据库缓存 #创建测试的test表 DROP TABLE IF EXISTS test; CREATE TABLE test( `id` ) NOT NULL, `name` ) DEFA ...

  3. 通过PlayBook部署Zabbix

    编写Linux初始化剧本 初始化剧本环节,主要用户实现关闭Selinux关闭防火墙,一起配置一下阿里云的YUM源地址,和安装EPEL源,为后期的zabbix安装做好铺垫工作. 1.在安装Zabbix之 ...

  4. centos7 安装vim

    刚安装的centos7一般只有vi可以用,vim是没有安装的,如果我们想使用的话,需要我们自己去安装,可以使用如下命令进行安装: yum -y install vim 安装之后就可以正常使用

  5. python爬虫简介

    一.什么是网络爬虫? 网络爬虫,是一种按照一定规则,自动的抓取万维网信息的程序或者脚本. 二.python网络爬虫, 需要用到的第三方包 requests和BeautifulSoup4 pip ins ...

  6. luogu P4755 Beautiful Pair

    luogu 这题有坨区间最大值,考虑最值分治.分治时每次取出最大值,然后考虑统计跨过这个位置的区间答案,然后两边递归处理.如果之枚举左端点,因为最大值确定,右端点权值要满足\(a_r\le \frac ...

  7. 借用jquery实现:使浏览器的“前进”按钮功能失效

    我借用jquery实现了这种效果,但并没有禁用掉浏览器本身的“前进”按钮,以下是代码,希望有用的朋友借鉴以下: $(function () { jQuery(window).bind("un ...

  8. TCP/IP模型层次结构

    计算机网络体系结构 (1)OSI七层协议:从上到下:应用层.表示层.会话层.传输层.网络层.数据链路层.物理层. (2)TCP/IP四层协议:从上到下:应用层,传输层.网络层.数据链路层.网络接口层. ...

  9. Redis总结1

    一.Redis安装(Linux) 1.在官网上下载Linux版本的Redis(链接https://redis.io/download) 2.在Linux的/usr/local中创建Redis文件夹mk ...

  10. flaskbb部署笔记

    https://flaskbb.org/ https://github.com/sh4nks/flaskbb/ https://flaskbb.readthedocs.io/en/latest/ins ...