单调栈——发射站

单调栈——发射站_第1张图片

 

从题目来分析,首先该题目有两个特别的性质,两边最近:多熟悉几次栈同学们就可以有着很明显的感觉,就是这道题要用到简单的数据结构的知识的知识第二个就是比他高,尝试带入单调性,所以显然,这道题考的就是单调栈的知识

运用到单调栈那么这道题就变得清晰了,分为两种情况:

1、如果下一座塔比当前栈顶的塔的高度低,那么当前栈顶就要吸收来的塔的能量

2、如果下一座塔比当前栈顶的塔的高度高,那么就破坏了当前的单调栈,所以一个while循环就要把之前比要来的塔的能量吸收掉

下面是我的代码:

#include 
#include 

using namespace std;

const int N = 1e6 + 100;
pair p[N];
int x,top,ans,n,m,b[N],s[N],a[N];

int main()
{
    ios::sync_with_stdio(false);
    cin >> n;
    for(int i = 1; i <= n; i ++ )
        cin >> a[i] >> b[i];
    p[++ top].first = a[1];
    p[top].second = 1;
    for(int i = 2; i <= n; i ++ )
        {
            while(a[i] > p[top].first && top)
            s[i] += b[p[top -- ].second];
        s[p[top].second] += b[i];
        p[++ top] = make_pair(a[i],i);
        }
        
    for(int i = 1; i <= n; i ++ )
        ans = max(ans,s[i]);
        
    cout << ans << endl;
    return 0;
}

其中#include 时pair类型的头文件,pair类型是把两个数存成一个数蛮方便的,

ios::sync_with_stdio(false);是取消了cin和stlib头文件的同步,所以速度大大提高。

你可能感兴趣的:(算法进阶指南)