zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    HTML学习笔记-框架(40)
    HTML学习笔记-使用div和table进行布局(36)
    MVC初体验-EF系列(总结)(23)
    MVC初体验-EF系列(延迟加载)(22)
    MVC初体验-EF系列(状态跟踪的修改)(21)
    MVC初体验-EF系列(CRUD)(20)
    回收站清空后立马恢复
    软件体验记录
    复杂网络,抽象语法树
    PHP修改记录
  • 原文地址:https://www.cnblogs.com/lovewhy/p/7651910.html
Copyright © 2011-2022 走看看