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 }