题目链接:https://www.luogu.org/problemnew/show/P2947

因为在单调队列上被dalao们锤爆

怒刷单调队列题

何为单调队列?

设我们的队列为从左至右单调递增

对于样例数据 3 2 6 1 1 2

我们先把3入队 此时队列:3

再将2从后面入队 此时队列:2 3

再将6从后面入队 但是,为了满足队列从左至右的单调性,我们将2,3出队 此时队列:6

再将1从后面入队 此时队列:1 6

再将1从后面入队 此时队列:1 1 6

再将2从后面入队 但是,为了满足队列从左至右的单调性,我们将1,1出队 此时队列:2 6

由此可以类推其他单调性。

于是,我们观察到单调队列和这道题的关系:

“谁把我从队列里赶了出去我就仰望谁。”

所以,2,3被6赶出去,2,3仰望的位置为6的位置即3。

所以,1,1被2赶出去,1,1仰望的位置为2的位置即6。

那么,如果我一直在队里。我就谁也不仰望。

下面介绍实现方式:

我先说:

"我永远都喜欢\(Stella\)!"

没良心的Master

单调队列需要一个支持从两边操作的队列——双端队列

\(STL\)中有现成的deque:

\(code:\)

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100000 + 10;
struct node{
int pos, val;
}a[maxn];//因为我们需要记录位置,所以开一个结构体。val为高度,pos为在序列的位置。
int n, ans[maxn];
deque<node> q;//双端队列。
int main()
{
scanf("%d",&n);
for(int i = 1; i <= n; i++)
{
scanf("%d",&a[i].val); a[i].pos = i;//输入高度,给位置赋值。
while(!q.empty() && a[i].val > q.back().val) ans[q.back().pos] = a[i].pos, q.pop_back();//当队列不为空时,如果当前输入的值大于我队列中后面的元素值,那么我就要仰望当前的输入值的位置。同时把我出队。
q.push_back(a[i]);//从后面将元素入队。
}
for(int i = 1; i <= n; i++)
printf("%d\n",ans[i]);
return 0;
}

至于为什么需要一个支持两头操作的队列。

在大部分单调队列题目中,需要维护的区间有时并不是整一个区间,而是多个区间。所以当如果我们单调队列中最前面的数已经不在当前区间里,我们需要将他从前面出队。

最前面的数一定比当前维护好的队列里所有数入队都早。如果他入队不是最早还比之前入队的数大,前面入队的数直接被他挤出队了。

欢迎交流/指错

一起共同进步。

QQ:935145183/3203600070

【luogu P2947 [USACO09MAR]向右看齐Look Up】 题解的更多相关文章

  1. luogu P2947 [USACO09MAR]向右看齐Look Up |单调队列

    题目描述 Farmer John's N (1 <= N <= 100,000) cows, conveniently numbered 1..N, are once again stan ...

  2. P2947 [USACO09MAR]向右看齐Look Up--单调栈

    单调栈真的很好用呢! P2947 [USACO09MAR]向右看齐Look Up 题目描述 Farmer John's N (1 <= N <= 100,000) cows, conven ...

  3. 洛谷 P2947 [USACO09MAR]向右看齐Look Up【单调栈】

    题目描述 Farmer John's N (1 <= N <= 100,000) cows, conveniently numbered 1..N, are once again stan ...

  4. 洛谷 P2947 [USACO09MAR]向右看齐Look Up

    目录 题目 思路 \(Code\) 题目 戳 思路 单调栈裸题 \(Code\) #include<stack> #include<cstdio> #include<st ...

  5. 洛谷P2947 [USACO09MAR]向右看齐Look Up

    #include<cstdio> #include<algorithm> #include<stack> #include<cctype> using ...

  6. 洛谷P2947 [USACO09MAR]仰望Look Up

    P2947 [USACO09MAR]仰望Look Up 74通过 122提交 题目提供者洛谷OnlineJudge 标签USACO2009云端 难度普及/提高- 时空限制1s / 128MB 提交   ...

  7. [USACO09MAR]向右看齐Look Up(单调栈、在线处理)

    https://www.luogu.org/problem/P2947 题目描述 Farmer John's N (1 <= N <= 100,000) cows, convenientl ...

  8. 【luogu P1955 [NOI2015]程序自动分析】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1955 并查集操作,1e9要离散化,数组要开大一些,操作前先执行合并操作 样例好毒啊(全是排好序的) #inc ...

  9. 【luogu P2195 HXY造公园】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2195 fir.吐槽题目(省略1w字 sec.考虑对一个森林的维护,每棵树用并查集维护. 操作1:输出当前查询 ...

随机推荐

  1. 安卓获取输入法高度与ViewTreeObserver讲解

    目录 安卓获取输入法高度 前言 清单 开始 ViewTreeObserver讲解 获取输入法高度原理 思路 实现 关于ViewTreeObserver 定义 继承 摘要 获取View高度的三种方法 源 ...

  2. FZU 1921——栀子花开——————【线段树单点更新】

    栀子花开 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status  ...

  3. 强哥的分享--如何使用Spring Boot做一个邮件系统

    http://springboot.fun/ actuator是单机.集群环境下要使用Spring Boot Admin将各个单机的actuator集成越来 mvn clean package -Dm ...

  4. 【Q】类和对象:游戏角色开发(角色介绍)

    案例情景:某公司要开发新游戏,请用面向对象的思想设计英雄类.怪物类和武器类. 编写测试类,创建英雄对象.怪物对象和武器对象,并输出各自的信息. 其中设定分别如下: 1.英雄类 属性:英雄名字.生命值. ...

  5. 译:面试投行的20个Java问题

    原文链接:https://dzone.com/articles/var-work-in-progress 作者:Anghel Leonard 译者:沈歌 如果你需要准备面试,可以看一下这篇博客中20个 ...

  6. 利用ajax短轮询+php与服务器交互制作简易即时聊天网站

    主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Server-sent Events). 本文主要介绍ajax短轮询的简易实现方式. 看懂此文 ...

  7. CSS的两种格式化上下文:BFC和IFC

    CSS的两种格式化上下文   文章包含很多个人理解,如果错误,欢迎指出~   在看本文之前,你要对CSS的盒子模型,Block-Level元素,Inline-Level元素有所了解,具体可参考CSS的 ...

  8. Disruptor之粗糙认识

    一 概述 1.Disruptor Disruptor是一个高性能的异步处理框架,一个“生产者-消费者”模型. 2.RingBuffer RingBuffer是一种环形数据结构,包含一个指向下一个槽点的 ...

  9. html中通过移除空格的方法来解决浏览器上的留白间距该怎么理解?

    今天在切图的时候,碰到一个兼容性的问题,很幸运最后通过张金鑫老师的文章解决了这个问题!但在阅读张老师文章的时候,我有个地方不明白,在网上查了下也没找到我想要的答案,后来自己想了半天好像是这么回事,现在 ...

  10. Java将科学计数法数据转为字符串

    如果Excel单元格数据类型为数值,数字太长会变成科学计数法,Java读取的时候使用如下方法可将其转为字符串 BigDecimal bd = new BigDecimal("3.000085 ...