栈讲解——整理

简单地说,栈是一种先进后出的数据结构,你可以把它想象成一个桶,每次只能从最顶端处放置或取出数据。

一般我们在io中用一个数组和栈顶指针(用int 便是下标)来模拟一个栈。

栈支持两个操作:

1.向栈顶加入一个元素

2。从栈顶取出一个元素。

这两个操作的时间复杂度都为o(1)

那么它所维护的这个数据集合中,数据之间有什么样的关系呢?

很简单,就是fisrt-in-last-out,或者更具体一点:如果一个元素在另一个元素之前加入这个集合中,那么它一定在那个元素之后退出这个集合。

单调栈

单调栈要求栈中的元素从栈底到栈顶是单调(有序)的,所以在加入一个新的元素时,如果它和栈顶元素不满足单调,那么将会依次弹出栈顶的元素直到这个元素加入到栈中依然满足单调,才将这个元素加入到栈中

例题:

https://www.luogu.org/problem/show?pid=2866

洛谷    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-conscious about her messy hairstyle, FJ wants to count the number of other cows that can see the top of other cows‘ heads.

Each cow i has a specified height hi (1 ≤ hi ≤ 1,000,000,000) and is standing in a line of cows all facing east (to the right in our diagrams). Therefore, cow i can see the tops of the heads of cows in front of her (namely cows i+1, i+2, and so on), for as long as these cows are strictly shorter than cow i.

Consider this example:

=

=       =

=   -   =         Cows facing right -->

=   =   =

= - = = =

= = = = = =

1 2 3 4 5 6 Cow#1 can see the hairstyle of cows #2, 3, 4

Cow#2 can see no cow‘s hairstyle

Cow#3 can see the hairstyle of cow #4

Cow#4 can see no cow‘s hairstyle

Cow#5 can see the hairstyle of cow 6

Cow#6 can see no cows at all!

Let ci denote the number of cows whose hairstyle is visible from cow i; please compute the sum of c1 through cN.For this example, the desired is answer 3 + 0 + 1 + 0 + 1 + 0 = 5.

牛#1 可以看到她们的发型 #2, 3, 4
牛#2 不能看到任何牛的发型
牛#3 可以看到她的发型 #4
牛#4 不能看到任何牛的发型
牛#5 可以看到她的发型 #6
牛#6 不能看到任何牛的发型!
让 c[i] 表示第i头牛可以看到发型的牛的数量;请输出 c[1] 至 c[N]的和。
如上面的这个例子,正确解是3 + 0 + 1 + 0 + 1 + 0 = 5。

农民约翰的某N(1 < N < 80000)头奶牛正在过乱头发节!由于每头牛都意识到自己凌乱不堪 的发型,约翰希望统计出能够看到其他牛的头发的牛的数量.

每一头牛i有一个高度所有N头牛面向东方排成一排,牛N在最前面,而 牛1在最后面.第i头牛可以看到她前面的那些牛的头,只要那些牛的高度严格小于她的高度,而且 中间没有比hi高或相等的奶牛阻隔.

让N表示第i头牛可以看到发型的牛的数量;请输出Ci的总和

输入输出格式

输入格式:

Line 1: The number of cows, N.

Lines 2..N+1: Line i+1 contains a single integer that is the height of cow i.

输出格式:

Line 1: A single integer that is the sum of c1 through cN.

输入输出样例

输入样例#1:

6
10
3
7
4
12
2

思路:

维护一个单调递减的栈,每次当加入一个比他前面的数大的值时,是这个栈不满足单调递减的,那就把它前面比他小的元素弹出栈,让这个数入栈,当这个数被弹出时他所能看到的牛的头发的个数为新入栈的数减去弹出的数-1;

懂了??

那就上代码!!

开long long 卡我9个点!!!!!

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 1<<30
#define N 80010
using namespace std ;
long long int stack[N],top,n,a[N];
long long ans=0;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
     cin>>a[i];//你也可以写成:scanf("%d",a+i);
    a[n+1]=maxn;
    for(int i=1;i<=n+1;i++)//最后一头牛也要算入
     {
         while(top&&a[stack[top]]<=a[i])//你是让这个元素的编号进栈
         {
             ans+=i-stack[top]-1;
             top--;
          }
          stack[++top]=i;
      }
    cout<<ans;
    return 0;
}
时间: 2024-08-05 22:20:34

栈讲解——整理的相关文章

前端技术栈使用整理

前端架构 技术栈nodewebpackvueiviewaxios 架构框架(核心)iview-adminhttps://github.com/iview/iview-admin 其他组件vue-cli-service 脚手架vuexvue-routerecharts 软件webStorm 语言ES6 语法监测eslint 数据模拟mockjs 模块安装npm/cnpm/yarn 工具SVN数据接口 DOClever项目管理 禅道反向代理 nginx数据缓存 redis 原文地址:https://

laravel5源码讲解整理

来源:http://yuez.me/laravel-yuan-ma-jie-du/?utm_source=tuicool&utm_medium=referral 目录 入口文件 index.php Illuminate\Foundation\Application 类 注入所有基础 Service Provider 入口文件 index.php 一个基于Laravel的应用,当WEB服务器接受到来自外部的请求后,会将这个这个请求解析到 应用根目录的 public/index.php 中. Lar

jquery源码学习(一)core部分

这一部分是jquery的核心 jquery的构造器 jquery的核心工具函数 构造器 jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' // Need init if jQuery is called (just allow error to be thrown if not included) return new jQu

《Java面试全解析》1000道面试题大全详解(转)

<Java面试全解析>1000道 面试题大全详解 本人是 2009 年参加编程工作的,一路上在技术公司摸爬滚打,前几年一直在上海,待过的公司有 360 和游久游戏,因为自己家庭的原因,放弃了阿里钉钉团队的 offer 回到了西安. 从 2015 年四月开始在一家上市公司担任研发经理的职位,至今也快 5 年了,一路上见了很多也面试了很多人技术人,大部分面试的结果很令我沮丧,这也是我出这本书的原因之一,帮助更多的人搞懂技术最核心的知识. 为了写好这个专栏内容,我先后拜访了一二十家互联网公司,与不同

进程、线程、多线程的网址集结(看)

面试总是会问这方面的内容,自己虽然知道一点点点点的概念,但是并不是很透彻的了解,这次,面试就挂在这个问题上了.哎.还是先提前写一下这个吧.进程和线程. 1.进程和线程 下面这个总结得挺好的. http://www.cnblogs.com/obama/archive/2013/04/12/3016509.html 2.多线程的讲解 http://blog.csdn.net/column/details/killthreadseries.html http://blog.csdn.net/morew

说说PendingIntent的内部机制

侯 亮 1 概述 在Android中,我们常常使用PendingIntent来表达一种"留待日后处理"的意思.从这个角度来说,PendingIntent可以被理解为一种特殊的异步处理机制.不过,单就命名而言,PendingIntent其实具有一定误导性,因为它既不继承于Intent,也不包含Intent,它的核心可以粗略地汇总成四个字--"异步激发". 很明显,这种异步激发常常是要跨进程执行的.比如说A进程作为发起端,它可以从系统"获取"一个Pe

软件测试入门随笔——软件测试基础知识(五)

测试一个app简单的登录功能有哪些测试点? 看视频后根据老师的讲解整理所得,发现了很多以前没有考虑过的情况,其中也有一些新接触的词汇,以下一一了解记录. 3-5-8原则 用户的操作在3s内响应,用户会觉得产品很优秀: 在5s内响应,用户会觉得产品还不错: 8s或者更长时间以后,用户会失去耐心. 单点登录 简称为 SSO,在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 例如:一个公司有OA系统.门户系统.人力资源管理系统.档案管理系统.生产管理系统.xx系统等,这么多个系统

缓存之常见问题及方案

 缓存来由 随着互联网系统发展的逐步完善,为了提高系统的qps,目前的绝大部分系统都增加了缓存机制从而避免请求过多的直接与数据库操作从而造成系统瓶颈,极大的提升了用户体验和系统稳定性.缓存主要都存放到内存里面,访问速度比数据库查询快很多. 缓存衍生的六大新生的问题 使用缓存给系统带来了一定的质的提升,但同时也带来了一些需要注意的问题.如果不注意.会导致系统的瘫痪.所以须仔细处理.六大问题分别为:1.缓存穿透 2.缓存雪崩 3.缓存击穿 4.缓存预热 5.缓存降级 6.缓存更新 缓存穿透之问题 缓

Spring Boot 面试,一个问题就干趴下了!

最近栈长面试了不少人,其中不乏说对 Spring Boot 非常熟悉的,然后当我问到一些 Spring Boot 核心功能和原理的时候,没人能说得上来,或者说不到点上,可以说一个问题就问趴下了! 这是我的问题: 我看你上面写了熟悉 Spring Boot,那你能讲下为什么我们要用 Spring Boot 吗? 下面我列几个最常见的三个回答: A:Spring Boot 最主要是不用 XML 配置,可以用 Java 来配置 bean,省去了许多配置文件. 我又问:Spring 本身就可以用 Jav