题意
Farmer John的奶牛在风中凌乱了它们的发型……
每只奶牛都有一个身高hi(1 ≤ hi ≤ 1,000,000,000),现在在这里有一排全部面向右方的奶牛,一共有N只(1 ≤ N ≤ 80,000)。对于奶牛i来说,如果奶牛i+1,i+2,……,N这些奶牛的身高严格小于奶牛i,则奶牛i可以看到它们凌乱的发型。

输入
第一行 奶牛数量N
第二到 N+1行:第i+1行输入奶牛i的身高

输出
第一行:一个整数即c1到cN的和

样例输入
6
10
3
7
4
12
2

样例输出
5

分析
方法一
对于i,我们知道,令j∈[i+1,n],s=max(hi+1....hj)是具有单调性的(感性理解,j越大数字越多,同时j更小时的数也没有丢掉),所以如果s<=h[i]时,就可以继续向右扩张。使用二分查找,RMQ查询。RMQ可以使用ST达到O(1)的查询。

方法二
一头牛看到多少牛不好做,但可以被多少牛看到可解。只要在左边形成一个递减的数列,且最后一个大于当前的牛即可,数列大小即为当前牛的答案。可以用单调栈维护。

代码(法一)

 #include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define RG register ll
#define rep(i,a,b) for(RG i=a;i<=b;++i)
#define per(i,a,b) for(RG i=a;i>=b;--i)
#define ll unsigned long long
#define inf (1<<29)
#define maxn 80005
#define ls (pos<<1)
#define rs (pos<<1|1)
#define mid ((t[pos].l+t[pos].r)>>1)
using namespace std;
ll n,ANS;
ll num[maxn],mx[maxn][];
inline ll read()
{
ll x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
/*
void build(ll pos,ll l,ll r)
{
t[pos].l=l,t[pos].r=r;
if(l==r) {t[pos].mx=num[l];return;}
build(ls,l,mid);build(rs,mid+1,r);
t[pos].mx=max(t[ls].mx,t[rs].mx);
} ll query(ll pos,ll l,ll r)
{
if(l<=t[pos].l&&t[pos].r<=r) return t[pos].mx;
ll ans=0;
if(l<=mid) ans=query(ls,l,r);
if(r>mid) ans=max(ans,query(rs,l,r));
return ans;
}
*/ void ST()
{
rep(i,,n) mx[i][]=num[i];
rep(j,,)
rep(i,,n)
if(i+(<<j)-<=n)
mx[i][j]=max(mx[i][j-],mx[i+(<<(j-))][j-]);
} int query(int l,int r)
{
int len=log(r-l+)/log();
return max(mx[l][len],mx[r-(<<len)+][len]);
} int main()
{
n=read();
rep(i,,n) num[i]=read();
//build(1,1,n);
ST();
rep(i,,n)
{
RG l=i+,r=n,ans=i,md;
while(l<=r)
{
md=(l+r)>>;
if(query(i+,md)<num[i]) ans=md,l=md+;
else r=md-;
}
ANS+=ans-i;
}
cout<<ANS;
return ;
}

Bad Hair Day [POJ3250] [单调栈 或 二分+RMQ]的更多相关文章

  1. BZOJ1767/Gym207383I CEOI2009 Harbingers 斜率优化、可持久化单调栈、二分

    传送门--BZOJCH 传送门--VJ 注:本题在BZOJ上是权限题,在Gym里面也不能直接看,所以只能在VJ上交了-- 不难考虑到这是一个\(dp\). 设\(dep_x\)表示\(x\)在树上的带 ...

  2. HUID 5558 Alice's Classified Message 后缀数组+单调栈+二分

    http://acm.hdu.edu.cn/showproblem.php?pid=5558 对于每个后缀suffix(i),想要在前面i - 1个suffix中找到一个pos,使得LCP最大.这样做 ...

  3. The Preliminary Contest for ICPC Asia Xuzhou 2019 E XKC's basketball team [单调栈上二分]

    也许更好的阅读体验 \(\mathcal{Description}\) 给n个数,与一个数m,求\(a_i\)右边最后一个至少比\(a_i\)大\(m\)的数与这个数之间有多少个数 \(2\leq n ...

  4. POJ3250(单调栈)

    Bad Hair Day Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17614   Accepted: 5937 Des ...

  5. 51nod 1962区间计数(单调栈加二分)

    题目要求是求出两个序列中处于相同位置区间并且最大值相同的区间个数,我们最直观的感受就是求出每个区间的最大值,这个可以O(N)的求,利用单调栈求出每个数作为最大值能够覆盖的区间. 然后我们可以在进行单调 ...

  6. [poj3250]单调栈 Bad Hair Day

    解题关键:将每头牛看到的牛头数总和转化为每头牛被看到的次数,然后用单调栈求解,其实做这道题的目的只是熟悉下单调栈 此题为递减栈 #include<cstdio> #include<c ...

  7. bzoj4540 序列 (单调栈+莫队+rmq)

    首先,如果我知道[l,r],要转移到[l,r+1]的时候,就是加上以r+1为右端点,[l,r+1]为左端点的区间的最小值,其他情况和这个类似 考虑这玩意怎么求 右端点固定的话,我左端点越往左走,这个最 ...

  8. poj3250单调栈

    有n只羊,(姑且算是羊吧,也有可能是牛啊猫啊什么之类的),每只羊都有一个身高,前面的羊要看到后面的羊的条件是,后面的羊高度要小于前面的羊,就问各位羊加起来看到的牛多少只....... #include ...

  9. 【洛谷P1823】音乐会的等待 单调栈+二分

    题目大意:给定一个长度为 N 的序列,定义两个数 \(a[i],a[j]\) 相互看得见,意味着 \(\forall k\in [i+1,j-1],a[k]\le a[i],a[k]\le a[j]\ ...

随机推荐

  1. 查看提交历史(git log)

    git log 命令 在完成了几次提交,或者克隆了一个已有提交历史的仓库后,要查看历史提交记录,可以通过git log命令来实现. $ git log commit 0becea8e1966df258 ...

  2. Mac环境下Redis的安装

    1.下载 官网下载地址:https://redis.io/download,选择对应的下载版本,我下载的是4.0.12 2.安装 1)下载文件解压后复制到/usr/local/目录下(快速找到路径小技 ...

  3. Vue + Element UI项目初始化

    1.安装相关组件 1.1安装Node 检查本地是否安装node node -v 如果没有安装,从Node官网下载 1.2安装npm npm -v 如果没有安装:使用该指令安装: npm install ...

  4. openpyxl使用sheet.rows或sheet.columns报TypeError: 'generator' object is not subscriptable解决方式

    解决方案: 因为新版本的openpyxl使用rows或者columns返回一个生成器所以可以使用List来解决报错问题 >>> sheet.columns[0] Traceback ...

  5. 预制体,Mask组件

    1.预制体制作和使用 a.制作预制体,将制作好的元素插入到在文件夹下形成一个预制体 b.将预制体在所调用的脚本文件中进行声明,并且在界面里进行拖入保存 c.使用的时候利用cc.instantiate进 ...

  6. css3——border-image属性的用法

    项目需求是实现鼠标移到按钮上时,下方显示一张渐变的三角图片,于是想到使用border-image来实现. 实现;//向外偏移10px,可使边框内部的内容不是那么紧凑border-image-repea ...

  7. cpu-z笔记本加条子

    前天:给笔记本升级能升级的东西就两个,一个内存条,一个光驱换固态硬盘,我说下升级内存 1.先将自己笔记本的型号上中关村在线查下自己的笔记本型号最大能支持多大的内存扩容 中关村在线网站:http://n ...

  8. 将已经存在的异步请求callback转换为同步promise

    由于js是单线程执行,为防止阻塞,会有很多异步回调函数callback,嵌套层次多了,可读性就差了很多.随着社区的发展,出现了promise.我们来将一些常见的回调函数做修改,变成promise的链式 ...

  9. javascript中的浅拷贝ShallowCopy与深拷贝DeepCopy

    拷贝,在js中,分为浅拷贝和深拷贝.这两者是如何区分的呢?又是如何实现的呢? 深浅拷贝的区分 首先说下,在js中,分为基础数据类型和复杂数据类型, 基础数据类型:Undefined.Null.Bool ...

  10. RabbitMQ 实现远程过程调用RPC

    RPC调用的顺序1. 在客户端初始化的时候,也就是SimpleRpcClient类初始化的时候,它会随机的创建一个callback队列,用于存放服务的返回值,这个队列是exclusive的.连接断开就 ...