1. 程式人生 > >[BZOJ] 1657: [Usaco2006 Mar]Mooo 奶牛的歌聲

[BZOJ] 1657: [Usaco2006 Mar]Mooo 奶牛的歌聲

bsp isp rst put main etc range depend details

1657: [Usaco2006 Mar]Mooo 奶牛的歌聲

Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 867 Solved: 610
[Submit][Status][Discuss]

Description

Farmer John‘s N (1 <= N <= 50,000) cows are standing in a very straight row and mooing. Each cow has a unique height h in the range 1..2,000,000,000 nanometers (FJ really is a stickler for precision). Each cow moos at some volume v in the range 1..10,000. This "moo" travels across the row of cows in both directions (except for the end cows, obviously). Curiously, it is heard only by the closest cow in each direction whose height is strictly larger than that of the mooing cow (so each moo will be heard by 0, 1 or 2 other cows, depending on not whether or taller cows exist to the mooing cow‘s right or left). The total moo volume heard by given cow is the sum of all the moo volumes v for all cows whose mooing reaches the cow. Since some (presumably taller) cows might be subjected to a very large moo volume, FJ wants to buy earmuffs for the cow whose hearing is most threatened. Please compute the loudest moo volume heard by any cow.

Farmer John的N(1<=N<=50,000)頭奶牛整齊地站成一列“嚎叫”。每頭奶牛有一個確定的高度h(1<=h<=2000000000),叫的音量為v (1<=v<=10000)。每頭奶牛的叫聲向兩端傳播,但在每個方向都只會被身高嚴格大於它的最近的一頭奶牛聽到,所以每個叫聲都只會 被0,1,2頭奶牛聽到(這取決於它的兩邊有沒有比它高的奶牛)。 一頭奶牛聽到的總音量為它聽到的所有音量之和。自從一些奶牛遭受巨大的音量之後,Farmer John打算買一個耳罩給被殘害得最厲 害的奶牛,請你幫他計算最大的總音量。

Input

* Line 1: A single integer, N.

* Lines 2..N+1: Line i+1 contains two space-separated integers, h and v, for the cow standing at location i.

第1行:一個正整數N.

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

Output

* Line 1: The loudest moo volume heard by any single cow.

隊伍中的奶牛所能聽到的最高的總音量.

Sample Input

3
4 2
3 5
6 10

INPUT DETAILS:

Three cows: the first one has height 4 and moos with volume 2, etc.

Sample Output

7

HINT

隊伍中的第3頭奶牛可以聽到第1頭和第2頭奶牛的歌聲,於是她能聽到的總音量為2+5=7.雖然她唱歌時的音量為10,但並沒有奶牛可以聽見她的歌聲.

Source

Silver

Analysis

單調隊列

就不畫圖了qwq

單調隊列的流程是從 1-n 和 n-1 分別掃一遍,代碼是完全一樣的只是 i 的遍歷順序不同

那麽對於一個奶牛 j ,他的歌聲如果要傳到奶牛 i 那裏,i 和 j 之間不能有阻擋

而且是嚴格大於,沒有等

所以突然就有了單調性

用單調隊列過一遍,當隊首的元素小於當前元素時將隊首彈出

(當前元素大於隊列中所有元素的時候,全部彈出)

彈到不能彈後,隊頭元素就可以聽到當前元素的歌聲了

然後把當前元素塞進隊首

Code

技術分享
 1 /**************************************************************
 2     Problem: 1657
 3     User: child
 4     Language: C++
 5     Result: Accepted
 6     Time:84 ms
 7     Memory:16912 kb
 8 ****************************************************************/
 9  
10 #include<cstdio>
11 #include<iostream>
12 #define maxn 1000000
13 using namespace std;
14  
15 int queue[maxn],tail,head,ans[maxn],n,high[maxn],ret,vol[maxn];
16  
17 int main(){
18     scanf("%d",&n);
19      
20     for(int i = 1;i <= n;i++){
21         scanf("%d%d",&high[i],&vol[i]);
22     }
23      
24     for(int i = 1;i <= n;i++){
25         while(high[queue[head]] <= high[i] && head > tail)
26             head--;
27 //      while(high[queue[tail+1]] > high[queue[head]] && head > tail)
28 //          tail++;
29         if(head > tail) ans[queue[head]] += vol[i];
30         queue[++head] = i;
31     }
32      
33     head = tail = 0;
34      
35     for(int i = n;i >= 1;i--){
36         while(high[queue[head]] <= high[i] && head > tail)
37             head--;
38 //      while(high[queue[tail+1]] > high[queue[head]] && head > tail)
39 //          tail++;
40         if(head > tail) ans[queue[head]] += vol[i];
41         queue[++head] = i;
42     }
43      
44     for(int i = 1;i <= n;i++){
45         ret = max(ret,ans[i]);
46     }
47      
48     printf("%d",ret);
49      
50     return 0;
51 }
心情奇差無比qwq

[BZOJ] 1657: [Usaco2006 Mar]Mooo 奶牛的歌聲