1. 程式人生 > >洛谷:P1901 發射站

洛谷:P1901 發射站

max 直接 %d int += -- 輸出 www 地址

原題地址:https://www.luogu.org/problemnew/show/P1901

題目簡述

有 N 個能量發射站排成一行,每個都有不相同的高度 \(H_i\),能向兩邊(當然兩端的只能向一邊)同時發射能量值為\(V_i\) 的能量,並且發出的能量只被兩邊最近的且比它高的發射站接收。

顯然,每個發射站發來的能量有可能被0或1或2個其他發射站所接受,求接收最多能量的發射站接收的能量是多少。


思路

每個能量塔射出的能量被左右第一個比其高的塔所攔截。隱隱約約覺得可以用單調棧搞……
維護一個高度單調不升棧,考慮依次將能量塔i加入棧:

  1. 如果高度比棧頂元素大或棧空,棧頂元素能量加上\(V_i\),壓入棧;
  2. 如果高度比棧頂元素小(棧頂元素編號記為top),當前能量塔i接收的能量加上\(V_{top}\),彈出棧頂元素。重復執行直到符合情況1,按1的處理方法處理。
    最後直接掃描一遍最大值,輸出。

代碼

#include <bits/stdc++.h>
using namespace std;
int s1[1000010],h[1000010],v[1000010],sum[1000010],ans,n,top;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) {
        scanf("%d%d",&h[i],&v[i]);
        while(top&&h[s1[top]]<h[i])
            sum[i]+=v[s1[top]],top--;
        sum[s1[top]]+=v[i];
        top++;
        s1[top]=i;
    }
    for(int i=1;i<=n;i++)
        ans=max(ans,sum[i]);
    printf("%d",ans);
    return 0;
}

洛谷:P1901 發射站