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

hdu3410 Passing the Message 单调栈

时间:2015-07-23 21:51:07      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:hdu3410   passing the message   单调栈   

// hdu3410 Passing the Message 单调栈
// 题目意思:给你n个数,询问第i个数直到左边比它本身大的第一个数的这段
// 区间内求一个最大的值 和 直到右边比它本身大的数的第一个数的这段区间内
// 再求一个最大值。


// 解题方法:
// 单调栈,维护一个栈,使得站内元素单调递减即离栈顶越近,值越小
// 从左往右扫一遍,最后一个比当前元素小的数组下标(出栈的元素)就是我们要求
// 的值。然后从右往左再扫一次,就可以了。


// 高大上一点,用了单调队列,只是队列的头不出而已,就是单调栈

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
const int MAX_N = 50008;
int deq[MAX_N];
int a[MAX_N];
int L[MAX_N];
int R[MAX_N];
int n;
void input(){
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
        scanf("%d",&a[i]);
}

void solve(){
    int head=0,tail=0;
    for (int i=1;i<=n;i++){
        int flag = 0;
        while(head < tail && a[deq[tail-1]]<=a[i]){
            tail--;
            flag = 1;
        }
        L[i] = flag ? deq[tail] : 0;
        deq[tail++] = i;
    }
    head = tail = 0;
    for (int i=n;i>=1;i--){
        int flag = 0;
        while(head < tail && a[deq[tail-1]] <= a[i]){
            flag = 1;
            tail--;
        }
        R[i] = flag ? deq[tail] : 0;
        deq[tail++] = i;
    }

    for (int i=1;i<=n;i++){
        printf("%d %d\n",L[i],R[i]);
    }
}


int main(){
    //freopen("1.txt","r",stdin);
    int t;
    scanf("%d",&t);
    int kase = 0;
    while(t--){
        printf("Case %d:\n",++kase);
        input();
        solve();
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu3410 Passing the Message 单调栈

标签:hdu3410   passing the message   单调栈   

原文地址:http://blog.csdn.net/timelimite/article/details/47028575

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