正题

题目链接:https://www.luogu.com.cn/problem/CF5E


题目大意

圆上有nnn个山,两个山之间可以看到当且仅当它们之间的两条弧中有一条满足所有山都不高于它们两个。

求可以看到的山的对数。

3≤n≤106,1≤hi≤1093\leq n\leq 10^6,1\leq h_i\leq 10^93≤n≤106,1≤hi​≤109


解题思路

先找到最高的山,然后先考虑它之外的点对再考虑这座山的贡献,因为这样矮的点之间肯定有一座高山挡着。

然后前后各维护一个单调队列,每个元素被弹出的时候就会统计一个点对。

然后考虑相同的情况,对于前后中的一个做的时候,弹完之后在单调队列上二分相同的位置即可。

时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+10;
int n,m,mx,top,a[N],b[N],s[N],v[N];
long long ans;
int main()
{scanf("%d",&m);mx=1;for(int i=1;i<=m;i++){scanf("%d",&b[i]);if(b[i]>b[mx])mx=i;}for(int i=mx+1;i<=m;i++)a[++n]=b[i];for(int i=1;i<mx;i++)a[++n]=b[i];for(int i=1;i<=n;i++){while(top>0&&a[s[top]]<a[i])top--,ans++;int l=1,r=top;while(l<=r){int mid=(l+r)>>1;if(a[s[mid]]==a[i])r=mid-1;else l=mid+1;}ans+=top-r;s[++top]=i;}top=0;for(int i=n;i>=1;i--){while(top>0&&a[s[top]]<a[i])top--,ans++;s[++top]=i;}for(int i=1,z=0;i<=n;i++)if(a[i]>=z)z=a[i],ans+=!v[i],v[i]=1;for(int i=n,z=0;i>=1;i--)if(a[i]>=z)z=a[i],ans+=!v[i],v[i]=1;printf("%lld\n",ans);return 0;
}

CF5E-Bindian Signalizing【单调栈】相关推荐

  1. POJ2796 Feel Good(单调栈)

    题意: 给出一列数据,要求一个区间内最小值与区间内数据总和乘积最大值 要点: 还是单调栈,这次我自己写的,先做了几题比较简单的果然还是有效果的,这题也是一样,按点遍历,网上大神做的是直接遍历一次即可, ...

  2. 【单调栈 前缀和 异或】7.21序列求和

    还要再细细思考的奇妙思路 题目描述 小A最近喜欢上了关于区间max的问题.她定义一个区间的价值是max(ai)(l<=i<=r)∗(alxoral+1xor...xorar)max(ai) ...

  3. 栈与队列7——单调栈结构(进阶问题)

    题目 一个含有重复值的数组arr,找到每一个i位置左边和右边离i位置最近且值比arr[i]小的位置,返回所有相应的信息. 举例:arr={3,4,1,5,6,2,7},返回如下的二维数组作为结果:{{ ...

  4. 栈与队列7——单调栈结构(初阶问题)

    题目 一个不含有重复值的数组arr,找到每一个i位置左边和右边离i位置最近且值比arr[i]小的位置,返回所有相应的信息. 举例:arr={3,4,1,5,6,2,7},返回如下的二维数组作为结果:{ ...

  5. 单调栈 or 线段树扫描线 ---- E. Delete a Segment [单调栈+二分] [扫描线处理空白位置的技巧乘2]

    题目链接 题目大意: 给出nnn个线段代表集合,现在问若可以将其中任意一个线段删除,则能够形成最多多少个独立的集合(取并集后) 解题思路1: 首先我们先对线段按照起点排序 那么我们枚举删除的线段iii ...

  6. 后缀数组 ---- 2018~2019icpc焦作H题[后缀数组+st表+二分+单调栈]

    题目链接 题目大意: 给出nnn个数,定义f[l,r]f[l,r]f[l,r]表示 区间[l,r][l,r][l,r]的最大值,求所有 子区间的最大值的和,要求相同的子区间只能算一次 比如数列 5 6 ...

  7. [Ahoi2013]差异[后缀数组+单调栈]

    链接 解题思路:很明显前面∑1<=i<j<=nlen(Ti)+len(Tj)\sum_{1<=i<j<=n}len(T_i)+len(T_j)∑1<=i< ...

  8. 【每日训练】2020/11/8(规律 + 二进制、单调栈 + 前缀和,后缀和、bitset + 枚举)

    整理的算法模板合集: ACM模板 目录 1. NC 打铁的箱子(规律 + 二进制) 2. NC 最优屏障(单调栈 + 前缀和,后缀和) 3. CF993C Careful Maneuvering(bi ...

  9. 0x11.基本数据结构 — 栈与单调栈

    目录 一.栈 0.AcWing 41. 包含min函数的栈 (自己造栈) 1.AcWing 128. 编辑器 (对顶栈) 2.AcWing 129. 火车进栈 3.AcWing 130. 火车进出栈问 ...

  10. 【数据结构】单调栈和单调队列 详解+例题剖析

    算法:单调栈和单调队列 一.单调栈和单调队列 二.单调栈例题 1.模板题入门 2.不懂不要急,看这道题 三.单调队列例题 1.入门 2.进阶 一.单调栈和单调队列 单调栈和单调队列与普通的栈,队列不同 ...

最新文章

  1. 00后的简历有多野?!!
  2. 东莞网络推广浅析如何通过简化标题来提升核心关键词排名能力呢?
  3. Apache OFBIZ高速上手(二)--MVC框架
  4. Linux下CMake简明教程(八) 添加编译选项
  5. entity-model-first
  6. php 获取 table,php – 获取表对象(App_Model_TableName)作为获取结果(Zend Framework)
  7. 塞内卡学院实现开源的价值
  8. python银行排队系统_python-我需要基于Web的系统的消息/排队解决...
  9. 解读全球热点,传递科研进展,这份AI内参要承包你的AI信息源
  10. python 内置函数_python的内置函数、方法
  11. 46、练习:输出指定目录下的所有文件名称
  12. optenstack配置keystone
  13. Julia科学记数法格式输出问题
  14. 时序数据库 VS 工业实时数据库
  15. Java读取Excel表格公式对应的值
  16. 备考电商双十一智齿客服主动营销功能大升级
  17. java两张图片拼接
  18. Web 实时消息推送详解
  19. 测试人生 | 00后0经验应届毕业生拿下2线城市15W offer,好励志~
  20. 【 MATLAB 】离散傅里叶变换(DFT)以及逆变换(IDFT)的MATLAB实现

热门文章

  1. c语言函数调用二次方程求根,[编程入门]自定义函数求一元二次方程 (C语言代码)...
  2. linux服务器管理公司用户,在Linux服务器Jenkins中管理用户和角色的方法
  3. 128位计算机 ps2,64位就是最强电脑?难道就没有128位的电脑吗
  4. 私有云存储 linux,搭建nextcloud私有云存储网盘
  5. MYSQL数据库表大小计算,计算mysql数据库数据表的大小,不精确,只是大略的数据...
  6. 计算机bq,BQ24721部分翻译
  7. 攻城时服务器维护,8月31日服务器维护更新公告
  8. c语言四个数找大wxyz,2015年计算机二级《C语言》考试上机测试题(7)
  9. 帆软获取上月的第一天与最后一天_《原神》岩港打工第一天怎么玩 岩港打工第一天玩法攻略...
  10. db2 删除存储过程_蚂蚁金服OceanBase挑战TPCC | TPCC基准测试之存储优化