首页 > 代码库 > Luogu【P1901】发射站(单调栈)

Luogu【P1901】发射站(单调栈)

题目链接

题目说明比自己矮的塔收不到自己的能量,摆明了就是单调栈呗。

把比自己矮的全都从栈里弹出去,于是碰到第一个比自己高的。让他接受自己发射的能量。

当然由于发射站发射的能量有两个方向,所以正反两遍。

然后 放代码。

#include<cstdio>
#include<cstdlib>
#include<cctype>
using namespace std;

long long ans;

inline long long max(long long a,long long b){    return a>b?a:b;    }

const int size=2000000;

long long stack[size],top;

inline long long read(){
    long long num=0,f=1;
    char ch=getchar();
    while(!isdigit(ch)){
        if(ch==-)    f=-1;
        ch=getchar();
    }
    while(isdigit(ch)){
        num=(num<<1)+(num<<3)+ch-0;
        ch=getchar();
    }
    return num*f;
}

struct file{
    long long h;
    long long v;
    long long c;
}que[size];


int main(){
    int n=read();
    for(int i=1;i<=n;++i){
        que[i].h=read();
        que[i].v=read();
    }
    for(int i=1;i<=n;++i){
        while(top&&que[stack[top]].h<=que[i].h)    top--;
        que[stack[top]].c+=que[i].v;
        stack[++top]=i;
    }
    top=0;
    for(int i=n;i>0;--i){
        while(top&&que[stack[top]].h<=que[i].h)    top--;
        que[stack[top]].c+=que[i].v;
        stack[++top]=i;
    }
    for(int i=1;i<=n;++i)    ans=max(ans,que[i].c);
    printf("%lld",ans);
    return 0;
}

 

Luogu【P1901】发射站(单调栈)