P1901 發射站 單調棧

2021-08-09 08:46:10 字數 1392 閱讀 6666

題目描述

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

顯然,每個發射站發來的能量有可能被 0 或 1 或 2 個其他發射站所接受,特別是為了安 全,每個發射站接收到的能量總和是我們很關心的問題。由於資料很多,現只需要你幫忙計 算出接收最多能量的發射站接收的能量是多少。

輸入格式:

第 1 行:乙個整數 n;

第 2 到 n+1 行:第 i+1 行有兩個整數 hi 和 vi,表示第 i 個人發射站的高度和發射的能量值。

輸出格式:

輸出僅一行,表示接收最多能量的發射站接收到的能量值,答案不超過 longint。

輸入樣例#1:

3

4 2

3 5

6 10

輸出樣例#1:

7
對於 40%的資料,1<=n<=5000;1<=hi<=100000;1<=vi<=10000;

對於 70%的資料,1<=n<=100000;1<=hi<=2,000,000,000;1<=vi<=10000;

對於 100%的資料,1<=n<=1000000;1<=hi<=2,000,000,000;1<=vi<=10000。

先考慮一半 若只向右邊發射能量 

那麼對於 i

j 右邊的一定不會接收到i的能量 

這讓我們想到了單調棧

向左向右分別做一次就好了

1 #include 2 #include 3

4 typedef long

long

ll;5

6const

int maxn=1000010;7

8int

n,top;910

inthigh[maxn],val[maxn],stack[maxn],pos[maxn];

1112

ll a[maxn],ans;

1314 inline void read(int&x)

1920 inline ll max(int a,int

b) 23

24int

hh()

33 top=0;34

for(int i=n;i>=1;--i)

40for(int i=1;i<=n;++i)

41 ans=max(ans,a[i]);

42 printf("

%lld\n

",ans);

43return0;

44}4546

int sb=hh();

47int main()

**

P1901 發射站(單調棧)

假設當前有 a 1 7 a 2 5 a 3 4 三個發射塔,現在在後面加乙個發射塔,高度為 a 4 6a 4 要接受 a 3 a 2 這兩個發射塔的訊號,以及將自身的訊號發射給 a 1 很明顯利用單調棧,將 a 3 出棧,再將 a 2 出棧,最後棧內只剩下 a 1 a 4 最後統計每乙個位置處的能量...

洛谷P1901 發射站(單調棧)

某地有 n 個能量發射站排成一行,每個發射站 i 都有不相同的高度 hi,並能向兩邊 當 然兩端的只能向一邊 同時發射能量值為 vi 的能量,並且發出的能量只被兩邊最近的且比 它高的發射站接收。顯然,每個發射站發來的能量有可能被 0 或 1 或 2 個其他發射站所接受,特別是為了安 全,每個發射站接...

單調棧 洛谷 P1901 發射站

某地有 n 個能量發射站排成一行,每個發射站 i 都有不相同的高度 hi,並能向兩邊 當 然兩端的只能向一邊 同時發射能量值為 vi 的能量,並且發出的能量只被兩邊最近的且比 它高的發射站接收。顯然,每個發射站發來的能量有可能被 0 或 1 或 2 個其他發射站所接受,特別是為了安 全,每個發射站接...