题目描述

给定长度为 N 的序列 A。每天,序列 A 中所有比两侧元素都小的元素都会消失。
对于原序列中所有元素,请求出它会在第几天之后消失(天数从 1 开始计算),或者指出它不
会消失。

数据范围

1 ≤ T ≤ 1, 000
1 ≤ N ≤ 1e5
1 ≤ Ai ≤ 1e9

输入格式

输入的第一行包含一个整数 T,代表测试数据的组数。接下来是 T 组数据。
每组数据的第一行包含一个整数 N。第二行包含 N 个整数 A1, A2, . . . , AN。

输出格式

对于每组数据,输出一行,包含 N 个整数。第 i 个整数代表第 i 个元素在第几天消失;如果
它不会消失,则应当为 0。

样例输入

1
6
3 2 5 4 1 7

样例输出

0 1 0 2 1 0

========================================================================================================================================================

关键词 : 栈

当时比赛未解决的题目

学长的题解 :

因为需要计算出在第几天被删除,暴力的做法必然会导致超时;

因此可以用栈来简化,求出最后剩下的;

设当前处理的数为 a[i],栈顶元素为 st[top]

如果 st[top]-1>st[top]<a[i];

则 删除栈顶元素 将 a [i] 压入栈

被删除的天数则考虑反证法,某一个数a[i]很大  , 多次参与 删除,则最后 一个因为a[i] 被删除的数的天数一定是 max(a[i]参与过的次数,该数参与过的次数) + 1 ,a[i] 参与的次数又发生变化。

========================================================================================================================================================

代码实现如下

 #include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + ; int ans[N],a[N],st[N],Max[N],top; int main()
{
int T; scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i = ;i <= n ;++i) ans[i] = Max[i] = ; top = ; //初始化
for(int i = ;i <= n ;++i) scanf("%d",a + i);
for(int i = ;i <= n ;++i){
while(top>=&&a[st[top]]<a[st[top-]]&&a[st[top]] < a[i])
{
ans[st[top]] = max(Max[st[top-]],Max[st[top]])+; //当前被删除的次数为max(前一位参与的次数,栈顶参与的次数)+1
Max[st[top-]] = ans[st[top]]; //前一位参与了这次删除,次数变化
--top;
}
st[++top] = i;
}
for(int i = ;i <= n;++i) printf(i==n?"%d\n":"%d ",ans[i]);
} return ;
}

17-比赛1 A - Weak in the Middle (栈)的更多相关文章

  1. 17-比赛1 F - 较小元素 Weak in the Middle (set)

    Seg-El has last chance to make the final changes in order to prevent the destruction of Krypton. He ...

  2. 题解 Weak in the Middle

    题目传送门 Description 有一个长度为 \(n\) 的序列 \(a_{1,2,...,n}\) ,每次可以删掉 \(a_i\),当 \(\min(a_{i-1},a_{i+1})>a_ ...

  3. React 17 要来了,非常特别的一版

    写在前面 React 最近发布了v17.0.0-rc.0,距上一个大版本v16.0(发布于 2017/9/27)已经过去近 3 年了 与新特性云集的 React 16及先前的大版本相比,React 1 ...

  4. ARC内存管理机制详解

    ARC在OC里面个人感觉又是一个高大上的牛词,在前面Objective-C中的内存管理部分提到了ARC内存管理机制,ARC是Automatic Reference Counting---自动引用计数. ...

  5. iOS-ARC

    1. 本文的主要内容: ARC的本质 ARC的开启与关闭 ARC的修饰符 ARC与Block ARC与Toll-Free Bridging ARC的本质 ARC是编译器(时)特性,而不是运行时特性,更 ...

  6. 原生JS判断密码强弱

    前些天工作中有这个需求,自己手写了相关的JS代码,第一种方法是通过ASCII 码判断密码类型,完成用户注册时判断用户输入密码的强度,分强.弱.中三等级,它可以根据用户输入的密码显示对应的密码强弱等级, ...

  7. js检测密码强度

    <script> function AuthPasswd(string) {     if(string.length >=6) {         if(/[a-zA-Z]+/.t ...

  8. python 字符串实例:检查并判断密码字符串的安全强度

    检查并判断密码字符串的安全强度 import string def check(pwd): #密码必须至少包含六个字符 if not isinstance(pwd,str) or len(pwd)&l ...

  9. 快速上手pandas(下)

      和上文一样,先导入后面会频繁使用到的模块: In [1]: import numpy as np import pandas as pd import matplotlib.pyplot as p ...

随机推荐

  1. The twentieth day

    Knowledge is power 知识就是力量 You're unique,nothing can replace you.你举世无双,无人可以替代.

  2. StackTrack for debug

    System.Diagnostics.Debug.WriteLine("Serial port. {0},{1}", this.GetType().FullName, new Sy ...

  3. java学习笔记之基础知识

    1.class不加修饰符默认default,只在当前包里能用. 2.构造函数前面的修饰符的作用类似class的,限制引用的权限. 3.java对象的创建其实就是类的实例化,类的实例化就是在堆上copy ...

  4. JavaScript基础:比较运算符——==与 ===;!=与!==

    var x=10, y="10", m=15 x==y;//返回true x===y;//返回false x!=y;//返回false x!==y;//返回true//同理cons ...

  5. Python基础学习之字符串(1)

    字符串 由字符组成的序列,即字符串. 1.基本字符串操作 所有标准的序列操作(索引.切片.乘法.判断成员资格.求长度.取最小值和最大值)对字符串同样适用: >>> website=' ...

  6. LeetCode OJ Palindrome Number(回文数)

    class Solution { public: bool isPalindrome(int x) { ,init=x; ) return true; ) return false; ){ r=r*+ ...

  7. Windows服务程序时钟调用

    1       大概思路 设计服务程序 创建服务 安装必备组件 编写Service1 运行效果 2       设计服务程序 创建服务程序,通过添加System.Timers时钟进行定时向Wecome ...

  8. CRUD全栈式编程架构之界面层的设计

    Layout的设计 模板模式 mvc的模板特别类似设计模式中模板方法模式,结合Layout中RenderSection和RenderBody方法可以将部分html展现逻辑延迟到具体的视图页面去实现里面 ...

  9. innerHTML动态添加html代码和脚本兼容性问题处理方法

    给某个元素的innerHTML赋值,并使得值中的js代码有效(兼容多个浏览器) 症状:给某个元素的 innerHTML 设置值时,如果提供的 HTML 代码中包含js脚本,很多时候这些脚本无效,或者在 ...

  10. 如何使用Win32API绘制树

    一.这个已经有几年时间了,刚开始学习charlie的<windows程序设计>的时候做的.现在看来,代码很乱,虽然后来还整理过几次,现在这方面没什么兴趣了,有兴趣的可自由下载. 二.绘制二 ...