2017.10.4 国庆清北 D4T1 财富

(其实这题是luogu P1901 发射站 原题,而且数据范围还比luogu小)

题目描述

LYK有n个小伙伴。每个小伙伴有一个身高hi。

这个游戏是这样的,LYK生活的环境是以身高为美的环境,因此在这里的每个人都羡慕比自己身高高的人,而每个人都有一个属性ai表示它对身高的羡慕值。

这n个小伙伴站成一列,我们用hi来表示它的身高,用ai来表示它的财富。

每个人向它的两边望去,在左边找到一个最近的比自己高的人,然后将ai朵玫瑰给那个人,在右边也找到一个最近的比自己高的人,再将ai朵玫瑰给那个人。当然如果没有比自己身高高的人就不需要赠送别人玫瑰了。也就是说一个人会给0,1,2个人玫瑰(这取决于两边是否有比自己高的人)。

每个人都会得到若干朵玫瑰(可能是0朵),LYK想知道得了最多的玫瑰的那个人得了多少玫瑰。(然后嫁给他>3<)

输入输出格式

输入格式:

第一行一个数n表示有n个人。

接下来n行,每行两个数hi,ai。

输出格式:

一个数表示答案。

输入输出样例

输入样例#1:
3
4 7
3 5
6 10
输出样例#1:
12

样例解释
第一个人会收到5朵玫瑰,第二个没人送他玫瑰,第三个人会收到12朵玫瑰。

说明

对于50%的数据n<=1000,hi<=1000000000。

对于另外20%的数据n<=50000,hi<=10。

对于100%的数据1<=n<=50000,1<=hi<=1000000000。1<=ai<=10000。

 1 /*
 2 维护正反两个单调栈,一个从1~n,表示向左传,一个从n~1,表示向右传
 3 如果栈顶的人比当前的人低,则将当前人弹出来,直到栈为空或找到一个比当前人高的人
 4 当前人后边的人如果往当前方向传,一定会被高的那个人收到,
 5 如果当前的人比栈顶高,则送出的花会被当前人收到,栈中比当前人低的人是一定不会收到后边人的鲜花的,所以将其弹出 
 6 如果当前的人比栈顶低,则当前人送出的花会被栈顶的人收到,然后将当前人弹入栈顶,因为当前人后边的人可能比当前的人低 
 7 */ 
 8 #include<cmath>
 9 #include<cstdio>
10 #include<cstring>
11 #include<iostream>
12 #include<algorithm>
13 #include<stack>
14 #include<queue>
15 #define N 50005
16 using namespace std;
17 
18 int n;
19 int h,p;
20 int maxn=-999999999;
21 int pos[N];
22 int high[N],power[N];
23 int ans[N];
24 stack<int> a;
25 
26 void add(int p)
27 {
28     while(!a.empty()&&high[a.top()]<=high[p])
29     {
30         a.pop();
31     }
32     if(!a.empty())
33     {
34         ans[a.top()]+=power[p];
35     }
36     a.push(p);
37 }
38 
39 void init()
40 {
41     scanf("%d",&n);
42     for(int i=1;i<=n;i++)
43     {
44         scanf("%d%d",&high[i],&power[i]);
45     }
46 }
47 
48 void work()
49 {
50     for(int i=1;i<=n;i++)
51     {
52         add(i);
53     }
54     while(!a.empty())
55     {
56         a.pop();
57     }
58     for(int i=n;i>=1;i--)
59     {
60         add(i);
61     }
62     for(int i=1;i<=n;i++)
63     {
64         if(maxn<ans[i])
65         {
66             maxn=ans[i];
67         }
68     }
69     printf("%d",maxn);
70 }
71 
72 int main()
73 {
74     freopen("treasure.in","r",stdin);
75     freopen("treasure.out","w",stdout);
76     init();
77     work();
78     fclose(stdin);
79     fclose(stdout);
80     return 0;
81 }
View Code
原文地址:https://www.cnblogs.com/lovewhy/p/7651910.html