AcWing 4721. 排队(单调栈+二分法)

news2024/9/28 17:25:46

问题描述

n 个小朋友排成一排,从左到右依次编号为 1∼n。

第 i 个小朋友的身高为 hi。

虽然队伍已经排好,但是小朋友们对此并不完全满意。

对于一个小朋友来说,如果存在其他小朋友身高比他更矮,却站在他右侧的情况,该小朋友就会感到不满。

每个小朋友的不满程度都可以量化计算,具体来说,对于第 i 个小朋友:

如果存在比他更矮且在他右侧的小朋友,那么他的不满值等于其中最靠右的那个小朋友与他之间的小朋友数量。
如果不存在比他更矮且在他右侧的小朋友,那么他的不满值为 −1。
请你计算并输出每个小朋友的不满值。

注意,第 1 个小朋友和第 2 个小朋友之间的小朋友数量为 0,第 1 个小朋友和第 4 个小朋友之间的小朋友数量为 2。

输入格式
第一行包含整数 n。

第二行包含 n 个整数 h1,h2,…,hn。

输出格式
共一行,输出 n 个整数,第 i 个整数为第 i 个小朋友的不满值。

数据范围
前 5 个测试点满足 2≤n≤5。
所有测试点满足 2≤n≤105,1≤hi≤109

输入样例1:

6
10 8 5 3 50 45

输出样例1:

2 1 0 -1 0 -1

输入样例2:

7
10 4 6 3 2 8 15

输出样例2:

4 2 1 0 -1 -1 -1 

输入样例3:

5
10 3 1 10 11

输出样例3:

1 0 -1 -1 -1 

分析

这道题的数据量是10的5次方,因此我们的算法最终的时间复杂度要控制在nlogn或者n。

1、两层循环(超时)

#include<iostream>
#include<cstring>
using namespace std;
const int N=2e5+10;
int n;
int a[N];
int h[N];
int main()
{
    memset(h,-1,sizeof h);
    cin>>n;
    for(int i=0;i<n;i++)
    {
        scanf("%d",a+i);
    }
    for(int i=0;i<n;i++)
    {
        int t=0;
        for(int j=i+1;j<n;j++)
        {
            if(a[j]<a[i])t=j;
        }
        if(t>0)
        h[i]+=t-i;
    }
    for(int i=0;i<n;i++)
    {
        cout<<h[i]<<" ";
    }
    return 0;
}

2、单调栈+二分(nlogn)

我们发现这道题是让我们找小于当前数的最右侧的一个,那么我们倒着遍历这个数组。
我们看下面这个图:

在这里插入图片描述
我们按照数字本身的大小将其画成上面的折线图,我们从右往左看,假设存在一个数大于50,那么他肯定大于45,所以而45又在50的右侧,所以这个50必定不是答案。按照这个思路,我们在从右往左遍历的过程中,我们只需要让小于栈顶元素的数入栈,因为大于栈顶的元素必定不是答案,所以没必要入栈。即下图:
在这里插入图片描述

当我们想找比8小的最右侧元素的时候,我们只需要去栈中找。我们发现,栈中的元素是单调的。因此,我们可以采用二分法去找。

#include<iostream>
#include<algorithm>
#include<cstring>
const int N=1e5+10;
int a[N],stk[N],top;
int ans[N];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)scanf("%d",a+i);
    for(int i=n-1;i>=0;i--)
    {
        if(!top||a[i]<=a[stk[top]])
        ans[i]=-1;
        else
        {
            int l=1,r=top;
            while(l<r)
            {
                int mid=l+r>>1;
                if(a[stk[mid]]<a[i])r=mid;
                else l=mid+1;
            }
            ans[i]=stk[r]-i-1;
        }
        if(!top||a[i]<a[stk[top]])stk[++top]=i;
    }
    for(int i=0;i<n;i++)
    {
        printf("%d ",ans[i]);
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/139454.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【闲聊杂谈】纤程的概念

首先要明白几个概念&#xff1a;程序、进程、线程、纤程。 如果要非常严格的定义上来说的话&#xff0c;进程是操作系统用来做资源调度的基本单位。后来发现进程的切换是在的太费资源了&#xff0c;于是诞生了线程&#xff1b;线程多了来回切换还是很费资源&#xff0c;于是又…

[Linux]Linux项目自动化构建工具-make/Makefile

&#x1f941;作者&#xff1a; 华丞臧. &#x1f4d5;​​​​专栏&#xff1a;【LINUX】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 推荐一款刷题网站 &#x1f449; LeetCode刷题网站 文…

FX5U-相对定位指令DRVI(DDRVI )两种写法

该指令通过增量方式(采用相对地址的位置指定)&#xff0c;进行1速定位。 以当前停止的位置作为起点&#xff0c;指定移动方向和移动量(相对地址)进行定位动作。如果驱动触点置为ON,则输出脉冲&#xff0c;并开始从偏置速度进行加速动作。到达指令速度后&#xff0c;以指令速度进…

【LeetCode】N皇后-回溯

N皇后-回溯N皇后题目示例分析代码N皇后II题目示例分析代码总结N皇后 题目 LeetCode 51.N皇后 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间…

第二篇 - Vue 的初始化流程

一&#xff0c;前言 上篇&#xff0c;使用 rollup 完成了 Vue2 源码环境的搭建 本篇&#xff0c;介绍 Vue 的初始化流程 二&#xff0c;Vue 简介 以两个概念性问题做简单介绍 1&#xff0c;问题&#xff1a;Vue 是 MVVM 框架吗&#xff1f; 在 Vue 官网上是这样说的&#…

LeetCode450之删除二叉搜索树中的节点(相关话题:二叉搜索树,删除)

题目描述 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 一般来说&#xff0c;删除节点可分为两个步骤&#x…

VS封装C++项目以及属性配置

目录 1. 封装单个项目 1.1 封装 新建C空项目&#xff0c;将需要封装的源文件(eval.cpp)和 头文件(eval.h)复制过来&#xff0c;并对它们做如下修改&#xff1a; 注&#xff1a;如果有多个头文件和源文件&#xff0c;只对可供外部调用的文件及其内部的函数作下面的处理 分别…

1.c++环境配置及第一个环境运行

开发IDE与环境 最好是使用ubuntu系统进行开发&#xff0c;如果没有的话&#xff0c;基于windows使用vs code 进行ssh连接到远程的ubuntu主机进行开发也可以。开发的过程跟本地差不多。 vs code IDE 插件的安装 1.变成中文菜单与提示,安装MS-CEINTL.vscode-language-pack-zh-…

《MySQL系列-InnoDB引擎13》文件-参数文件

文件 MySQL数据和InnoDB存储引擎表中的各种类型的文件&#xff0c;这些文件如下&#xff1a; 参数文件&#xff1a;MySQL启动时的数据库文件&#xff0c;指定初始化参数&#xff0c;介绍各种参数类型&#xff0c;以及定义某种内存结构的大小等日志文件&#xff1a;用来记录My…

C语言日常练习

这里写目录标题循环结构输入两个正整数m和n&#xff0c;求其最大公约数和最小公倍数求Snaaaaaaaaaa……的值&#xff0c;其中a是一个数字&#xff0c;n表示a的个数&#xff0c;n和a都由键盘输入一维数组从键盘输入十个数&#xff0c;并将正着输出反着输出从键盘输入十个数&…

虹科案例 | 解决ASRS系统的痛点问题居然这么简单?(上)

摘要 ASRS(自动存储和检索系统)在内部物流领域变得越来越常见。内部物流包括优化、整合、自动化和管理履行或配送中心内的货物物流流动。 ASRS穿梭机经常用在具有多个存储级别的配送中心的仓库或库存集装箱中处理散装产品的托盘。 自动化存储和检索系统的定义是专门为物料的存…

springcloud-02-微服务间通信及熔断组件

第二章 微服务间通信及熔断组件 1. 微服务间通信组件 1.1 基于RestTemplate的服务调用 Spring框架提供的RestTemplate类可用于在应用中调用rest服务&#xff0c;它简化了与http服务的通信方式&#xff0c;统一了RESTful的标准&#xff0c;封装了http链接&#xff0c; 我们只…

初识 Node.js

1、回顾与思考 1.1、浏览器中的 JavaScript 的组成部分 1.2、思考&#xff1a;为什么 JavaScript 可以在浏览器中被执行 1.3、思考&#xff1a;为什么 JavaScript 可以操作 DOM 和 BOM 1.4、浏览器中的 JavaScript 运行环境 2、Node.js 简介 2.1、什么是 Node.js Node.js…

RSA加密算法完整加密流程

RSA完整加密流程总结1.1-RSA加密介绍RSA公钥加密算法是1977年由罗纳德李维斯特&#xff08;Ron Rivest&#xff09;、阿迪萨莫尔&#xff08;Adi Shamir&#xff09;和伦纳德阿德曼&#xff08;Leonard Adleman&#xff09;一起提出的。1987年7月首次在美国公布&#xff0c;当时…

实习------Spring 框架学习

Spring 是什么&#xff08;了解&#xff09; 在不同的语境中&#xff0c;Spring 所代表的含义是不同的。下面我们就分别从“广义”和“狭义”两个角度&#xff0c;对 Spring 进行介绍。 广义上的 Spring 泛指以 Spring Framework 为核心的 Spring 技术栈。 经过十多年的发展&…

【原创】升级需谨慎,开发两行泪!——记一次MySQL驱动包升级引发的事故

一、背景最近项目组在版本迭代时&#xff0c;组件也要进行升级&#xff0c;此时涉及到MySQL驱动包jdbc的版本升级。即从5.1.X升级到8.0.X。然鹅在上线之后就出现了一部分兼容性问题&#xff0c;造成了一次“事故”&#xff1a;调用接口出现“系统错误”。查看日志&#xff1a;j…

C. Least Prefix Sum(可以后悔的拿取+multiset)

Problem - C - Codeforces 波罗的海&#xff0c;一个著名的棋手&#xff0c;同时也是一个数学家&#xff0c;他有一个数组a1,a2,...,an&#xff0c;他可以进行以下几次&#xff08;可能是0次&#xff09;操作。 选择某个索引i&#xff08;1≤i≤n&#xff09;。 将ai与-1相乘&…

Ffmpeg中AVFrame数据保存成YUV--讨论AVFrame的linesize

目录 YUV播放器 AVFrame中保存成YUV实现 linesize的意义 实测(PC机-64bits-win10) 总结&#xff1a; YUV播放器 首先要有一个YUVplayer用来播放测试的YUV数据&#xff0c;雷神改良过的YUV播放器&#xff1a; 修改了一个YUV/RGB播放器_雷霄骅的博客-CSDN博客 播放器播放界…

查询是: LOCK TABLE test.xx_test IN ACCESS SHARE MODE问题解决办法

如题所示&#xff0c;这个问题是我在postgresql中使用pg_dump备份多个schema的表时遇到的问题。bin\pg_dump --dbnamepostgresql://dbuser:123456localhost:5432/test --table public.xx_user --table test.xx_test -f d:\tools\pgsql\dump.sql pg_dump: 错误: 查询失败: 閿欒…

react生命周期(类组件/函数组件)

1.react代码模式分为两种 类组件和函数组件&#xff08;生命周期也有所不同&#xff09; 2.类组件&#xff08;写法如下&#xff09; import React from react export default class App1 extends React.Component{state {username:,password:}setUser (event) > {this.s…