soj 2511 Moooo 单调栈

原创 2015年11月17日 22:11:46

http://acm.scu.edu.cn/soj/problem.action?id=2511
题意:每头牛都会发出叫声,然而这个叫声只会被离他最近的一个比他高的牛听到,当然这个叫声是双向传播的。
思路:
找出第一个比他高的,就可以维护一个从栈顶到栈底单调增的栈,每次每个元素要进栈之前就将栈中所有比他小的元素出栈,这样之后栈顶的元素就是第一个比他高的。也就是跟那个windy cake 类似,把当前元素当做最大值,找这个最长区间,区间的边界就是两边的第一个比他高的,找到以后将这个牛听到的声音加上传来的音量。 每个元素都要找第一个比他高的元素利用单调栈就将复杂度从O(n^2) 降到O(n)。
左右各做一次单调栈就好了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
using namespace std;
#define M 100009
int n,h[M],v[M],ans[M];
int main()
{
    while(scanf("%d",&n) == 1)
    {
        memset(ans,0,sizeof(ans));
        for(int i = 0;i < n;i++) scanf("%d %d",&h[i],&v[i]);
        stack<int> s;
        int maxx = 0;
        for(int i = 0;i < n;i++) //对于每个元素找左边第一个高的,从左到右做单调栈
        {
            while(!s.empty() && h[s.top()] < h[i]) s.pop();
            if(!s.empty())
            {
                ans[s.top()] += v[i]; //第一个比他高的听到了这个声音
                maxx = max(maxx,ans[s.top()]);
            }
            s.push(i);
        }
        while(!s.empty()) s.pop();
        for(int i = n - 1;i >= 0;i--) //对于每个元素找右边第一个高的,从右到左做单调栈
        {
            while(!s.empty() && h[s.top()] < h[i]) s.pop();
            if(!s.empty())
            {
                ans[s.top()] += v[i];
                maxx = max(maxx,ans[s.top()]);
            }
            s.push(i);
        }
        printf("%d\n",maxx);
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

SCU-2511: Moooo【单调栈】

Farmer John's N (1 <= N <= 50,000) cows are standing in a very straight row and mooing. Each cow has...

hdu5033 Building单调栈

题意 一条直线上有很多房子,房子的信息包括位置和高度,给出一些询问,当有一个人站在某两个房子之间时,能看到的最大的角度(尽可能广阔的天空) 求解 可以很容易想到求解左边最大的仰角,右边最大的仰角...

[BZOJ1657][Usaco2006 Mar]Mooo 奶牛的歌声(单调栈)

想战胜心里的不安,也是很辛苦的吧。

【数据结构】单调栈

之前没有写过栈 栈是只能在某一端插入和删除的特殊线性表 就像一个桶一样 我们可以用STL 也可以自己写 单调栈 故名思议 就是多了个 单调 的要求

Terrible Sets(单调栈,一开始还被题目描述吓到了,理解样例后发现就是纸老虎题。。。)

Link:http://poj.org/problem?id=2082 Terrible Sets Time Limit: 1000MS   M...

CodeForces 547B - Mike and Feet(单调栈)

题意:给定一个长度为 n (1 ≤ n ≤ 2 × 105) 的序列,求某一固定长度的连续子序列(长度为1 ~ n)中最小元素的最大值。 对于某一元素,找出它为最小值的最大连续长度区间。...

Codeforces548D:Mike and Feet(单调栈)

Mike is the president of country What-The-Fatherland. There are n bears living in this country besid...

POJ 2796 Feel Good 单调栈

最近做这方面的题很多,感觉单调栈很是神奇,通过维护一个单调不减的栈,遇到小于栈顶的栈顶元素便出栈,此时跟新结果。 这个比RMQ的ST算法要快很多,ST算法要枚举每一个区间(没想到其他做法,可能要dp...

HDU 1506 Largest Rectangle in a Histogram(DP·单调栈)

Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768...
  • acvay
  • acvay
  • 2014-09-02 09:50
  • 451

POJ-2082 Terrible Sets (单调栈)

今天知道有单调栈这种数据结构 用单调递增栈很容易就能求出以h[i]为最小值的区间 大致过程如下: 若h[i]=s[top].h,且此h[i]的起始位置为弹出的最后一个元素的起始位置; 否则直接进栈,其...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)