【JZOJ】【單調棧】奶牛的歌聲

LinkLink

JZOJJZOJ 12561256

DescriptionDescription

Farmer John的N(1<=N<=50,000)頭奶牛喜歡站成一排一起唱歌(當然我們能聽見的只是牛叫)。每頭奶牛都有自己獨特的身高h(1<=h<=2,000,000,000),並且唱歌時的音量爲v(1<=v<=10,000)。每頭奶牛的叫聲都會從她所在的位置出發,向隊列的兩邊傳播(當然,站在隊伍兩端的奶牛例外)。並且,FJ注意到一個奇特的事實:當某頭奶牛唱歌時,整個隊伍中,在左右兩個方向上,只有身高比她高且與她最接近的奶牛能聽見她的歌聲(也就是說,任何一頭奶牛的叫聲可能被0頭、1頭或2頭奶牛聽到,這取決於在這頭奶牛的左右方向上有沒有比她更高的奶牛)。
每頭奶牛在唱歌時所聽到的總音量,定義爲她所能聽見的所有其他奶牛歌聲音量的和。考慮到某些奶牛(一般是較高的那些)聽到的總音量很高,爲了保護她們的聽力,FJ決定爲聽到總音量最高的奶牛買副耳套。他想請你計算一下,在整個隊列中,所聽到總音量最高的那頭奶牛聽到的總音量的具體數值。

InputInput

第1行: 一個正整數,N
第2…N+1行: 每行包括2個用空格隔開的整數,分別代表站在隊伍中第i個位置的奶牛的身高以及她唱歌時的音量

OutputOutput

第1行: 隊伍中的奶牛所能聽到的最高的總音量

SampleSample InputInput

3
4 2
3 5
6 10

SampleSample OutputOutput

7

HintHint

【樣例說明】
隊伍中有3頭奶牛,第1頭牛的身高是4,音量是2
其餘依此類推。
隊伍中的第3頭奶牛可以聽到第1頭和第2頭奶牛的歌聲
於是她	能聽到的總音量爲2+5=7。
雖然她唱歌時的音量爲10,但並沒有奶牛可以聽見她的歌聲。

TrainTrain ofof ThoughtThought

正反兩邊單調棧
如果棧頂比當前牛高,將當前牛收入棧,遇見高的牛就出棧,然後累計起來,最後求最大值就好了

CodeCode

#include<iostream>
#include<cstdio>

using namespace std;

int f[50005];
int n, ans, top;

struct stack
{
	long long h;
	int v;
}Stack[50005];//棧

struct Cow
{
	long long h;
	int v;
}cow[50005];

int main()
{
	scanf("%d", &n);
	for (int i = 1; i <= n; ++i)
	  scanf("%d%d", &cow[i].h, &cow[i].v);
	for (int i = 1; i <= n; ++i) {
		while (Stack[top].h < cow[i].h && top)
		{
			f[i] += Stack[top].v;
			top--;
		}
		Stack[++top].h = cow[i].h; Stack[top].v = cow[i].v;
	}
	top = 0;
	for (int i = n; i >= 1; --i)
	{
		while (Stack[top].h < cow[i].h && top)
		{
			f[i] += Stack[top].v;
			top--;
		}
		Stack[++top].h = cow[i].h; Stack[top].v = cow[i].v;
	}
	for (int i = 1; i <= n; ++i)
	 ans = max(ans, f[i]);
	printf("%d", ans);
}

發佈了224 篇原創文章 · 獲贊 35 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章