传送门


这是一道典型的单调栈。


题意理解

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

其实就是求对于序列中的每一个数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. DevExpress v18.2版本亮点——Analytics Dashboard篇(二)

    行业领先的.NET界面控件——DevExpress v18.2版本亮点详解,本文将介绍了DevExpress Analytics Dashboard v18.2 的版本亮点,新版30天免费试用!点击下 ...

  2. Flask【第4篇】:用Flask的扩展实现的简单的页面登录

    用flask的扩展实现的简单的页面登录 from flask import Flask,render_template,request,redirect,session app = Flask(__n ...

  3. PageOffice修改注册码升级版本

    java: 删除pageoffice.jar所在目录(一般是WEB-INF/lib)下的license.lic文件(若服务器运行时找不到该文件,可在浏览器地址栏里面通过localhost方式访问pos ...

  4. M(model)V(view)C(controller,serlvet),(分) 静态工厂模式,单例模式

  5. php array_push()函数 语法

    php array_push()函数 语法 作用:向第一个参数的数组尾部添加一个或多个元素(入栈),然后返回新数组的长度.博智达 语法:array_push(array,value1,value2.. ...

  6. 判断div里面的子集是否含有特定的类

    if($('#BankCardId .card').length){ alert("请绑定银行卡"); } if ($('#user-20130011 #age-20130011' ...

  7. Sonys TRC save data plolicy

    帖子地址:https://forums.unrealengine.com/showthread.php?130820-Sonys-TRC-save-data-plolicy we had severa ...

  8. 箭头函数(Arrow Functions)

    ES5语法: var getPrice = function() { return 4.55; }; console.log(getPrice()); ES6 中,箭头函数就是函数的一种简写形式,使用 ...

  9. 快速构建Spring Cloud工程

    spring cloud简介 spring cloud为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选.分布式会话等等.它运行环境 ...

  10. C/C++中动态内存分配

    代码段:用来存放程序执行代码的一块内存区域.这部分内存大小在程序运行前已经知道,通常属于只读,其中包括只读的字符串常量,不可改变 BBS段:用来存放存放程序中未初始化的全局变量及静态变量,属于静态内存 ...