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

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

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 526  Solved: 365
[Submit][Status]

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

题解:萌萌哒我赶脚此题超级神似Bzoj1660,这道题还是直接线段树维护即可,方法类似bzoj1660(话说今天才发现bzoj1660里面的b数组根本没用到啊呵呵。。。)

 1 var
 2    i,j,k,l,m,n:longint;
 3    a,b,c,e:array[0..500000] of longint;
 4 function max(x,y:longint):longint;
 5          begin
 6               if x>y then max:=x else max:=y;
 7          end;
 8 function min(x,y:longint):longint;
 9          begin
10               if x<y then min:=x else min:=y;
11          end;
12 procedure build(x,y,z:longint);
13           begin
14                if (x=y) then
15                   begin
16                        a[z]:=c[x];
17                        b[z]:=x;
18                   end
19                else
20                    begin
21                         build(x,(x+y) div 2,z*2);
22                         build((x+y) div 2+1,y,z*2+1);
23                         a[z]:=max(a[z*2],a[z*2+1]);
24                    end;
25           end;
26 function getright(x,y,z,l,r,t:longint):longint;
27          var
28             i,j,k:longint;
29          begin
30               if l>r then exit(-1);
31               if c[l]>t then exit(l);
32               if a[z]<=t then exit(-1);
33               if (l=r) or (x=y) then exit(-1);
34
35               i:=getright(x,(x+y) div 2,z*2,l,min(r,(x+y) div 2),t);
36               if i=-1 then
37                  getright:=getright((x+y) div 2+1,y,z*2+1,max(l,(x+y) div 2+1),r,t)
38               else
39                   getright:=i;
40          end;
41 function getleft(x,y,z,l,r,t:longint):longint;
42          var
43             i,j,k:longint;
44          begin
45               if l>r then exit(-1);
46               if a[z]<=t then exit(-1);
47               if c[r]>t then exit(r);
48               if (x=y) or (l=r) then exit(-1);
49
50               i:=getleft((x+y) div 2+1,y,z*2+1,max(l,(x+y) div 2+1),r,t);
51               if i=-1 then
52                  getleft:=getleft(x,(x+y) div 2,z*2,l,min(r,(x+y) div 2),t)
53               else
54                   getleft:=i;
55          end;
56 begin
57      readln(n);
58      for i:=1 to n do
59          readln(c[i],e[i]);
60      build(1,n,1);
61      fillchar(b,sizeof(b),0);
62      for i:=1 to n do
63          begin
64               j:=getleft(1,n,1,1,i-1,c[i]);
65               k:=getright(1,n,1,i+1,n,c[i]);
66               if j<>-1 then b[j]:=b[j]+e[i];
67               if k<>-1 then b[k]:=b[k]+e[i];
68          end;
69      l:=0;
70      for i:=1 to n do
71          l:=max(l,b[i]);
72      writeln(l);
73 end.
74                     
时间: 2024-10-19 08:38:02

1657: [Usaco2006 Mar]Mooo 奶牛的歌声的相关文章

BZOJ 1657: [Usaco2006 Mar]Mooo 奶牛的歌声( 单调栈 )

从左往右,从右往左 扫两遍,单调栈维护... ---------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<stack> #include<iostream> #define rep( i , n ) for( int i = 0 ; i &

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

1657: [Usaco2006 Mar]Mooo 奶牛的歌声 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 858  Solved: 603[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

[BZOJ1657][Usaco2006 Mar]Mooo 奶牛的歌声

1657: [Usaco2006 Mar]Mooo 奶牛的歌声 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 863  Solved: 607 [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 heigh

[BZOJ1657] [Usaco2006 Mar] Mooo 奶牛的歌声 (单调栈)

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 th

[Usaco2006 Mar]Mooo 奶牛的歌声题解

题目链接 bzoj1657 思路: 本题可用单调栈思想来解.维护一个单调下降的序列,由于是下降的,所以栈里的每一头牛的声音都不能被后面的牛听到.当一个身高较大的牛加入栈时,栈不再单调,需要踢掉一些牛,而那些牛的身高都比它矮所以可以把那些牛的声音加到当前牛的伤残值里.而由于那些较矮的牛的声音会被阻挡,所以踢掉不会影响后续答案. 由于声音是双向传播的,所以需要正序做一遍,再逆序做一遍. code: #include<cstdio> #include<iostream> #include

【树形DP/搜索】BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会

1827: [Usaco2010 Mar]gather 奶牛大集会 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 793  Solved: 354[Submit][Status][Discuss] Description Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会.每个奶牛居住在 N(1<=N<=100,000) 个农场中的一个,这些农场由N-1条道路连接,并且从任意一个

BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会( dp + dfs )

选取任意一个点为root , size[ x ] 表示以 x 为根的子树的奶牛数 , dp一次计算出size[ ] && 选 root 为集会地点的不方便程度 . 考虑集会地点由 x 点向它的子节点 son 转移 , 那么以 son 为集会地点比以 x 为集会地点要多 dist( x , son ) * ( tot - size[ x ] ) - dist( x , son ) * size[ x ] = dist( x , son ) * ( tot - 2 * size[ x ] )

【BZOJ 1827】 [Usaco2010 Mar]gather 奶牛大集会

1827: [Usaco2010 Mar]gather 奶牛大集会 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 722  Solved: 314 [Submit][Status][Discuss] Description Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会.每个奶牛居住在 N(1<=N<=100,000) 个农场中的一个,这些农场由N-1条道路连接,并且从任意

BZOJ 1657 奶牛的歌声

单调栈. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 50050 using namespace std; int n,v[maxn],h[maxn],s[maxn],ans[maxn],t=0; int main() { scanf("%d",&n); for (int i=1;i<=n;i++