传送门


这是一道典型的单调栈。


题意理解

先来理解一下题意(原文翻译得有点问题)。

其实就是求对于序列中的每一个数i,求出i到它右边第一个大于i的数之间的数字个数c[i]。最后求出和。

首先可以暴力求解,时间复杂度o(n^2)显然TLE。

然后就是用单调栈来做。

单调栈

单调栈就是维护一个栈,使得栈中的元素是单调的(递增/递减)。

假设是递减——对于每一个新来的元素,把栈顶大于这个元素的每一个数字全部弹出,最后把这个元素加进去。

(如果栈为空,直接加入)

单调栈有什么用呢?

  • 单调递增栈能以o(n)时间复杂度求出左右两边第一个比它比它小的元素。
  1. 进栈元素能入栈的时候,此时栈顶元素一定是第一个左边第一个比进栈元素小的元素。
  2. 栈内元素出栈的时候,此时进栈元素一定是第一个右边第一个比栈顶元素小的元素。
  • 单调递减栈能以o(n)时间复杂度分别求左右两边第一个比它大的元素。
  1. 进栈元素能入栈的时候,此时栈顶元素一定是第一个左边第一个比进栈元素大的元素。
  2. 栈内元素出栈的时候,此时进栈元素一定是第一个右边第一个比栈顶元素大的元素。

解题思路

因为这道题求的是最大的元素,所以用单调递减栈。

第一种方法就是对于每一个元素,求出其右边第一个大于它的元素,最后作差求和。

第二种更为简单却难以思考的方法是对于每一个即将进栈的数,ans就加上此时(该元素还未进栈)栈内的元素个数。

为什么呢?

此时对于栈内的所有元素,一定是呈单调递减的,所以这个即将进栈的元素就能被栈内的元素看到,所以答案加上栈内的元素个数。

注意事项

  • 用long long,否则会爆。
  • 注意读题,出栈的条件是<=而不是<。
  • while循环&&的s.size()条件必须放在左边。

AC代码

 #include<iostream>
#include<stack>
#include<cstdio>
using namespace std;
long long ans;
stack<int>s;
int n,now;
int main(){
cin>>n;
for(int i=;i<=n;++i)
{
scanf("%d",&now);
while(s.size()&&s.top()<=now) s.pop();
ans+=s.size();
s.push(now);
}
cout<<ans;
return ;
}

单调栈 && 洛谷 P2866 [USACO06NOV]糟糕的一天Bad Hair Day(单调栈)的更多相关文章

  1. 洛谷P2866 [USACO06NOV]糟糕的一天Bad Hair Day(单调栈)

    题目描述 Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self ...

  2. 洛谷P2866 [USACO06NOV]糟糕的一天Bad Hair Day

    P2866 [USACO06NOV]糟糕的一天Bad Hair Day 75通过 153提交 题目提供者洛谷OnlineJudge 标签USACO2006云端 难度普及/提高- 时空限制1s / 12 ...

  3. 洛谷 P2866 [USACO06NOV]糟糕的一天Bad Hair Day 牛客假日团队赛5 A (单调栈)

    链接:https://ac.nowcoder.com/acm/contest/984/A 来源:牛客网 题目描述 Some of Farmer John's N cows (1 ≤ N ≤ 80,00 ...

  4. 洛谷 P2866 [USACO06NOV]糟糕的一天Bad Hair Day

    题目描述 Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self ...

  5. 洛谷——P2866 [USACO06NOV]糟糕的一天Bad Hair Day

    https://www.luogu.org/problem/show?pid=2866 题目描述 Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are h ...

  6. P2866 [USACO06NOV]糟糕的一天Bad Hair Day--单调栈

    P2866 [USACO06NOV]糟糕的一天Bad Hair Day 题意翻译 农夫约翰有N (N \leq 80000)N(N≤80000)头奶牛正在过乱头发节.每一头牛都站在同一排面朝东方,而且 ...

  7. 洛谷P2866 [USACO06NOV]Bad Hair Day S (单调栈)

    看到这道题很容易想到单调栈,但我一开始想的是从后往前扫,但发现会有问题(因为这样会对后面牛的答案造成影响),所以这时我们要及时换一个思路,从前往后扫. 维护一个单调递减的栈,插入h[i]时,小等于它的 ...

  8. 洛谷 2866 [USACO06NOV]糟糕的一天Bad Hair Day

    [题意概述] 给出一个长度为n的序列a,求有多少对[i,j]满足i<j且a[i]>max(a[i+1],a[i+2],...,a[j]). [题解] 单调栈. 倒着处理序列的元素,维护一个 ...

  9. bzoj1660 / P2866 [USACO06NOV]糟糕的一天Bad Hair Day

    P2866 [USACO06NOV]糟糕的一天Bad Hair Day 奶牛题里好多单调栈..... 维护一个单调递减栈,存每只牛的高度和位置,顺便统计一下答案. #include<iostre ...

随机推荐

  1. Selenium Java tutorial

     https://eyes.applitools.com/app/test-results 1.

  2. 前端之JQuery:JQuery文档操作

    jquery之文档操作 一.相关知识点总结1.CSS .css() - .css("color") -> 获取color css值 - .css("color&qu ...

  3. LOJ2320「清华集训 2017」生成树计数

    由于菜鸡的我实在是没学会上升幂下降幂那一套理论,这里用的是完全普通多项式的做法. 要是有大佬愿意给我讲讲上升幂下降幂那一套东西,不胜感激orz! 首先可以想到prufer序列,如果不会的话可以左转百度 ...

  4. SSM框架整合之单独整合Mybatis

    整合步骤 导入必须jar包 mybatis核心jar包 mybatis依赖jar包 数据库驱动包 建立数据库表 建立实体类 建立Mapper接口 建立sql映射文件 <?xml version= ...

  5. [USACO2009 OPEN] 滑雪课 Ski Lessons

    洛谷P2948 看到题目就觉得这是动规但一直没想到如何状态转移……看了别人的题解之后才有一些想法 f[i][j]:前i单位时间能力值为j可以滑的最多次数 lessons[i][j]:结束时间为i,获得 ...

  6. 内存泄露问题改进(转自vczh)

    参考:http://www.cppblog.com/vczh/archive/2010/06/22/118493.html 参考:https://www.cnblogs.com/skynet/arch ...

  7. React 之React.createContext

    使用Context,可以跨越组件进行数据传递 import React from 'react'; import ReactDOM from 'react-dom'; const ThemeConte ...

  8. PHP超大文件上传与下载

    前段时间做视频上传业务,通过网页上传视频到服务器. 视频大小 小则几十M,大则 1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题:1,文件过大,超出服务端的请求大小限制:2,请求时间过长, ...

  9. 20181019-JSP 教程/简介

    JSP 教程 这是第一篇JSP JSP与PHP.ASP.ASP.NET等语言类似,运行在服务端的语言. JSP(全称Java Server Pages)是由Sun Microsystems公司倡导和许 ...

  10. Linux用户和用户组指令

    1.创建用户 >useradd username 创建用户 >passwd username 给用户设置密码 ======================================= ...