[CSP-S模拟测试]:你相信引力吗(单调栈)
题目传送门(内部题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$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int n;
int a[10000001],sta[10000001],sam[10000001],mx,top;
namespace ae86{
const int bufl=1<<15;
char buf[bufl],*s=buf,*t=buf;
inline int fetch(){
if(s==t){t=(s=buf)+fread(buf,1,bufl,stdin);if(s==t)return EOF;}
return*s++;
}
inline int read(){
int a=0,b=1,c=fetch();
while(!isdigit(c))b^=c=='-',c=fetch();
while(isdigit(c))a=a*10+c-48,c=fetch();
return b?a:-a;
}
}
using ae86::read;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
a[i+n]=a[i]=read();
if(a[i]>a[mx])mx=i;
}
long long ans=0;
for(int i=mx;i<mx+n;i++)
{
while(top&&sta[top]<a[i]){ans++;top--;}
if(sta[top]>a[i])ans++;
else ans+=sam[top]+(a[i]!=a[mx]);
sta[++top]=a[i];
sam[top]=(a[i]==sta[top-1]?sam[top-1]+1:1);
}
while(top>2)
{
if(sta[top]==sta[2])break;
top--;ans++;
}
printf("%lld",ans);
return 0;
}
rp++
[CSP-S模拟测试]:你相信引力吗(单调栈)的更多相关文章
- 联赛模拟测试24 D. 你相信引力吗 单调栈
题目描述 分析 因为跨过最大值的区间一定是合法的,所以我们人为地把最大值放在最左边 我们要统计的就是在最大值右边单调不降的序列,可以用单调栈维护 需要特殊处理相同的情况 代码 #include< ...
- 2018.11.02 NOIP模拟 优美的序列(数论+单调栈/链表)
传送门 考虑如果一个区间满足最小值等于最大公约数那么这个区间是合法的. 因此我们对于每一个点维护可以延展到的最左/右端点保证这一段区间的gcdgcdgcd等于这个点的值. 这个可以用之前同类的链表或者 ...
- [CSP-S模拟测试]:Star Way To Heaven(最小生成树Prim)
题目描述 小$w$伤心的走上了$Star\ way\ to\ heaven$. 到天堂的道路是一个笛卡尔坐标系上一个$n\times m$的长方形通道(顶点在$(0,0)$和$(n,m)$),小$w$ ...
- Android单元测试与模拟测试详解
测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...
- [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)
目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...
- 安装nginx python uwsgi环境 以及模拟测试
uwsgi帮助文档: http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html http://uwsgi-docs.re ...
- 利用Python中的mock库对Python代码进行模拟测试
这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下 ...
- 转 C#实现PID控制的模拟测试和曲线绘图
C#实现PID控制的模拟测试和曲线绘图 本文分两部分,一部分是讲PID算法的实现,另一部分是讲如何用动态的曲线绘制出PID运算的结果. 首先,PID算法的理论模型请参考自动控制理论,最早出现的是模 ...
- Mockito:一个强大的用于Java开发的模拟测试框架
https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...
随机推荐
- mongodb 添加用户
use admindb.createUser({ user:"admin", pwd:"abc123456", roles:[{role:"root& ...
- vue-时间插件,效果见图
<template> <div class="select-time-wrapper"> <h5 class="titie"> ...
- Docker 环境下部署 redash
环境: centos7 官网:https://redash.io/help/open-source/dev-guide/docker 一.安装步骤 1.虚拟机安装 安装vmware,并安装centos ...
- Eclipse集成spring-tool-suite(STS)
1.官方下载 sts是spring官方在eclipse基础上加了很多插件之后封装的开发工具.sts与eclipse完全一样,但是多了很多插件,比如maven,使用起来更加方便.如果使用eclipse自 ...
- 前端开发 | 尝试用Markdown写一下近几个月的总结
近期总结 回顾 半年前 半年前,接触了前端一年多(工作半年)的我了解的东西只有下面这些.因为在公司里的工作就是切静态页,捣鼓CMS. HTML (比较简洁的编写HTML) CSS/CSS3 (PC兼容 ...
- linux系统设置登录失败n次锁定账户:vim /etc/pam.d/system-auth
auth required pam_env.so 登陆后的环境变量 auth sufficient pam_fprintd.so 指纹认证 auth sufficient pam_unix.so nu ...
- 第三方库-时间函数dateutil
在dateutil中,吸引我的东西有2个,1个是parser,1个是rrule. 其中parser是根据字符串解析成datetime,而rrule是则是根据定义的规则来生成datetime. 安装没必 ...
- xhost + command not found
如下是一个示例: 原本我以为在没有联网的情况下.不能使用yum 的.可能是本地配置了yum 了吧也可以使用 1. [oracle@11GR2-test ~]$ export DISPLAY=192.1 ...
- CentOS 6的系统启动流程
一.POST加电自检 按下电源后ROM芯片中的CMOS程序执行并检测CPU.内存等设备是否存在并正常运行,CMOS中的程序叫BIOS,可以设置硬盘接口,网卡声卡开关之类的简单设置.一般PC机主板上有一 ...
- BZOJ1306 [CQOI2009]match循环赛/BZOJ3139 [Hnoi2013]比赛[dfs剪枝+细节题]
地址 看数据范围很明显的搜索题,暴力dfs是枚举按顺序每一场比赛的胜败情况到底,合法就累计.$O(3^{n*(n-1)/2})$.n到10的时候比较大,考虑剪枝. 本人比较菜所以关键性的剪枝没想出来, ...