码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces548D:Mike and Feet(单调栈)

时间:2015-10-24 13:02:06      阅读:246      评论:0      收藏:0      [点我收藏+]

标签:

Mike is the president of country What-The-Fatherland. There are n bears living in this country besides Mike. All of them are standing in a line and they are numbered from 1 to n from left to right. i-th bear is exactly ai feet high.

技术分享

A group of bears is a non-empty contiguous segment of the line. The size of a group is the number of bears in that group. The strengthof a group is the minimum height of the bear in that group.

Mike is a curious to know for each x such that 1?≤?x?≤?n the maximum strength among all groups of size x.

Input

The first line of input contains integer n (1?≤?n?≤?2?×?105), the number of bears.

The second line contains n integers separated by space, a1,?a2,?...,?an (1?≤?ai?≤?109), heights of bears.

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 test(s)
input
10
1 2 3 4 5 4 3 2 1 6
output
6 4 4 3 3 2 2 1 1 1 

题意:
给出n个数,这n个数在区间长度为i(1~n)的时候能够切割成一些区间。这每一个区间都会有一个最小值。在相同长度的这些区间的最小值中,输出最大值

思路:
使用单调栈,保持栈内的数的单调递增性

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <bitset>
#include <algorithm>
#include <climits>
using namespace std;

#define LS 2*i
#define RS 2*i+1
#define UP(i,x,y) for(i=x;i<=y;i++)
#define DOWN(i,x,y) for(i=x;i>=y;i--)
#define MEM(a,x) memset(a,x,sizeof(a))
#define W(a) while(a)
#define gcd(a,b) __gcd(a,b)
#define LL long long
#define N 200005
#define MOD 1000000007
#define INF 0x3f3f3f3f
#define EXP 1e-8
#define lowbit(x) (x&-x)

/*
num栈顶的元素,width宽度,跟如今入栈的数之间相隔了多少个数,由于要求的是连续区间。所以这个也是必须记录的
*/
struct node
{
    int num,width;
    node() {};
    node(int _num,int _width):num(_num),width(_width) {}
};

stack<node> S;
int a[N],ans[N];

int main()
{
    int n,i,j;
    scanf("%d",&n);
    for(i = 0; i<n; i++)
        scanf("%d",&a[i]);
    a[n++] = 0;
    MEM(ans,0);
    for(i = 0; i<n; i++)
    {
        int len = 0;//连续区间的长度
        node k;
        while(!S.empty())
        {
            k = S.top();
            if(k.num<a[i])
                break;
                //新入栈的元素比栈顶元素要小,那么对于这个连续区间而言,这个比新入栈的元素就没实用了,能够出栈
            int ls=k.width+len;//出栈的同一时候获得其长度
            if(k.num>ans[ls])//ans记录ls区间的时候的最大值
            {
                ans[ls]=k.num;
            }
            len+=k.width;
            S.pop();
        }
        S.push(node(a[i],len+1));
    }
    for(i = n-1; i>=1; i--)//由于上面仅仅更新了一部分的点,所以如今要对那些没有更新的点也更新
        ans[i]=max(ans[i],ans[i+1]);
    printf("%d",ans[1]);
    for(i = 2; i<n; i++)
        printf(" %d",ans[i]);
    printf("\n");

    return 0;
}


版权声明:本文博主原创文章,博客,未经同意不得转载。

Codeforces548D:Mike and Feet(单调栈)

标签:

原文地址:http://www.cnblogs.com/mengfanrong/p/4906494.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!