Description

Today is Christmas day. There are n single boys standing in a line. They are numbered form 1 to n from left to right. The i-th single boy has ai single strength. They are singing single boy Christmas song! Single boy,single boy, single all the way, having party together and turning into gay! Hey!
A group of single boys is non-empty contiguous segment of the line. The size of a group is the number of single boys in that group. The single strength of a group is the minimum single strength of the single boy in that group.
Now we want to know for each x such that 1<=x<=n the maximum single strength among all groups of size x.

Input

The first line of input contains T(<=30), the test cases.
For each test case, the first line is a integer n(1 <= n <= 2*10^5), the number of single boys.
The second line contains n integers [1,10^9] separated by space, the single strength of each single boy.

Output

Print n integers in one line. For each x from 1 to n, print the maximum strength among all groups of size x.

Sample Input

1
10
1 2 9 3 8 2 2 10 19 6

Sample Output

19 10 6 2 2 2 2 2 2 1

题意:n个数,(1<=k<=n),在n个数中连续的k个数为一个区间长度,一共有n-k+1个区间,
每个区间选出区间中的最小值min[j](1<=j<=n-k+1),然后在n-k+1个区间中选出最大的
min[j],得到max[i](1<=i<=k),然后按k=1~n顺序输出max[i].
由于数据太大,暴力模拟寻找太慢不能实现,所以我们想到的是求 以num[i]为最小值
的区间长度,然后选择区间长度相等Max(num[i]),开始我用了暴力寻找区间,由于数据
太大,TLE了,后来学习别人方法,用栈求得区间长度,我们把以num[i]为最小值的区间
的左右边界求出来,右边界-左边界就是区间长度;
用栈求区间左右边界:先求左边界后求右边界,开始将下标0入栈,我们的数组是从1
开始的,然后比较以栈顶元素为下标的值是否大于等于当前值,是的话出栈,直到比当前
值小,当前值的左边界就等于当前下标-栈顶元素+1,最后每次都要把当前下标入栈,
求右边界完全一样。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
using namespace std;
const int maxn=;
struct ac
{
int num;
int l,r;
}d[maxn];
int ans[maxn];
stack<int>sta;
int main()
{
int t,n,Top,dn;
scanf("%d",&t);
while(t--)
{
int flag=;
scanf("%d",&n);
d[].num=;///以0 ,n+1为下标的值为0.
d[n+].num=; sta.push();///压入0下标
for(int i=; i<=n; i++)
{
scanf("%d",&d[i].num);
while(!sta.empty())///求左边界
{
Top=sta.top();
if(d[Top].num>=d[i].num)///比较当前值与以栈顶元素为下标的值
sta.pop();
else
break;
}
Top=sta.top();
d[i].l=Top+;///左边界
sta.push(i);///每次压入当前下标
}
while(!sta.empty())
sta.pop(); sta.push(n+);///求右边界,压入下标n+1
for(int i=n; i>=; i--)
{
while(!sta.empty())
{
Top=sta.top();
if(d[Top].num>=d[i].num)
sta.pop();
else
break;
}
Top=sta.top();
d[i].r=Top-;
sta.push(i);
}
while(!sta.empty())
sta.pop();
memset(ans,,sizeof(ans));
for(int i=; i<=n; i++)///求ans,每次都更新 以区间长度为dn的最大值
{
dn=d[i].r-d[i].l+;
ans[dn]=max(ans[dn],d[i].num);
}
for(int i=n-;i>=;i--)///有些区间长度是找不到,那么用比他区间长度大的更新其值
{
if(ans[i]<ans[i+])
ans[i]=ans[i+];
} printf("%d",ans[]);
for(int i=; i<=n; i++)
printf(" %d",ans[i]);
printf("\n");
}
return ;
}

样例值 1 2 9 3 8 2 2 10 19 6
以该值为最
小值的区间长度 10 9 1 3 1 9 9 2 1 3
区间长度为 10有1 ,max[10]=1;
区间长度为 9 有2,2,2,max[9]=2;
区间长度为 4-8 都没有,即为0,那么以区间为长度为9的更新max[4-8]=2;
区间长度为 3有 3,6, max[3]=6;
区间长度为 2有 10, max[2]=10;
区间长度为 1有 9,8,19,max[1]=19;
为什么以区间更大的修改,以为区间越大,数值越小,区间小的的最大值不可能大于
区间大的最大值

技巧题---Single boy的更多相关文章

  1. Gym 101102J---Divisible Numbers(反推技巧题)

    题目链接 http://codeforces.com/gym/101102/problem/J Description standard input/output You are given an a ...

  2. OCP 认证考试报名费技巧题库051052053解析合格线

    本人于2017年4月22日通过参加OCP考试,第一次参加,一天之内考了三门,三门一次性通过,052 - 95% ,053 - 86% ,051 - 100% 一.关于考试考试报名费: 052:158$ ...

  3. LeetCode算法题-Single Number(Java实现)

    这是悦乐书的第175次更新,第177篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第34题(顺位题号是136).给定一个非空的整数数组,除了一个元素外,每个元素都会出现两 ...

  4. 【LOJ6043】「雅礼集训 2017 Day7」蛐蛐国的修墙方案(搜索技巧题)

    点此看题面 大致题意: 给你一个长度为\(n\)的排列\(p\),要求构造一个合法的括号序列,使得如果第\(i\)个位置是左括号,则第\(p_i\)个位置一定是右括号. 暴搜 很容易想出一个暴搜. 即 ...

  5. POJ 2229 Sumsets(技巧题, 背包变形)

    discuss 看到有人讲完全背包可以过, 假如我自己做的话, 也只能想到完全背包了 思路: 1. 当 n 为奇数时, f[n] = f[n-1], 因为只需在所有的序列前添加一个 1 即可, 所有的 ...

  6. 【动态规划技巧题】POJ2229-Sumsets

    [题目大意] 把一个数n分成2的指数幂相加的形式,问有几种情况. [思路] 如果当前i为奇数,则必定有至少一个1,可以看作i-1的情形再加上一个1.即f[i]=f[i-1]. 如果当前i为偶数,假设没 ...

  7. FZU 1922——非主流——————【技巧题】

    非主流 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status P ...

  8. HDU 5288——OO’s Sequence——————【技巧题】

    OO’s Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  9. nyoj 1205——简单问题——————【技巧题】

    简单问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 给你一个n*m的矩阵,其中的元素每一行从左到右按递增顺序排序,每一列从上到下按递增顺序排序,然后给你一些数x ...

随机推荐

  1. [leetcode]Combine Two Tables

    leetcode竟然有sql的题了..两道简单的应该会做 这个题主要就是一个left join... # Write your MySQL query statement below SELECT P ...

  2. [转载]CSS教程:实例讲解定位Position

    http://www.missyuan.com/thread-395406-1-1.html 1. position:static 所有元素的默认定位都是:position:static,这意味着元素 ...

  3. CSS - Tooltip-arrow 绘制三角形

    问题:纯CSS实现bubble的三角形部分 方法:使用border来绘制三角形:例如 .trangle { ; border-color: transparent; border-style: sol ...

  4. alt属性和title属性差异---终于分清楚了!

    凡是接触过前端的开发者,相信都会接触到<img>标签,自然alt title更是不会陌生,但对他们真正的含义和使用方法,你确定了解吗? 参考: http://www.junchenwu.c ...

  5. Devexpress HtmlEditor 上传本地图片

    官方Demo地址:https://demos.devexpress.com/MVCxHTMLEditorDemos/Features/Features 控件的一定要包裹在form中 @using(Ht ...

  6. saiku之行速度优化(三)

    经历了前两轮优化之后,saiku由不可使用,优化到可以使用,不过在分析大量日志数据的时候,还有顿卡的感觉!继续观察背后执行的Sql,决定将注意力关注到索引上面! 日志的主要使用场景是:固定日期维度的数 ...

  7. JAVA IO NIO

    http://www.cnblogs.com/handsome1013/p/4882862.html http://www.cnblogs.com/dolphin0520/ http://www.cn ...

  8. oracle 11g设置打开空表extent储存块

    sql>alter system set deferred_segment_creation=false; sql>show parameter deferred_segment_crea ...

  9. 栈的图文解析 和 对应3种语言的实现(C/C++/Java)

    概要 本章会先对栈的原理进行介绍,然后分别通过C/C++/Java三种语言来演示栈的实现示例.注意:本文所说的栈是数据结构中的栈,而不是内存模型中栈.内容包括:1. 栈的介绍2. 栈的C实现3. 栈的 ...

  10. 二叉查找树(三)之 Java的实现

    概要 在前面分别介绍了"二叉查找树的相关理论知识,然后给出了二叉查找树的C和C++实现版本".这一章写一写二叉查找树的Java实现版本. 目录 1. 二叉树查找树2. 二叉查找树的 ...