zoukankan      html  css  js  c++  java
  • P1901 发射站 单调栈

    题目描述

    某地有 N 个能量发射站排成一行,每个发射站 i 都有不相同的高度 Hi,并能向两边(当 然两端的只能向一边)同时发射能量值为 Vi 的能量,并且发出的能量只被两边最近的且比 它高的发射站接收。

    显然,每个发射站发来的能量有可能被 0 或 1 或 2 个其他发射站所接受,特别是为了安 全,每个发射站接收到的能量总和是我们很关心的问题。由于数据很多,现只需要你帮忙计 算出接收最多能量的发射站接收的能量是多少。

    输入输出格式

    输入格式:

    第 1 行:一个整数 N;

    第 2 到 N+1 行:第 i+1 行有两个整数 Hi 和 Vi,表示第 i 个人发射站的高度和发射的能量值。

    输出格式:

    输出仅一行,表示接收最多能量的发射站接收到的能量值,答案不超过 longint。

    输入输出样例

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

    说明

    对于 40%的数据,1<=N<=5000;1<=Hi<=100000;1<=Vi<=10000;

    对于 70%的数据,1<=N<=100000;1<=Hi<=2,000,000,000;1<=Vi<=10000;

    对于 100%的数据,1<=N<=1000000;1<=Hi<=2,000,000,000;1<=Vi<=10000。

    先考虑一半 若只向右边发射能量 

    那么对于 i<j  h[i]<h[j]

    j 右边的一定不会接收到i的能量 

    这让我们想到了单调栈

    向左向右分别做一次就好了

     1 #include <ctype.h>
     2 #include <cstdio>
     3 
     4 typedef long long LL;
     5 
     6 const int MAXN=1000010;
     7 
     8 int n,top;
     9 
    10 int high[MAXN],val[MAXN],stack[MAXN],pos[MAXN];
    11 
    12 LL a[MAXN],ans;
    13 
    14 inline void read(int&x) {
    15     register char c=getchar();
    16     for(x=0;!isdigit(c);c=getchar());
    17     for(;isdigit(c);x=x*10+c-48,c=getchar());
    18 }
    19 
    20 inline LL max(int a,int b) {
    21     return a<b?b:a;
    22 }
    23 
    24 int hh() {
    25     read(n);
    26     for(int i=1;i<=n;++i) read(high[i]),read(val[i]);
    27     for(int i=1;i<=n;++i) {
    28         while(top&&stack[top]<=high[i]) --top;
    29         a[pos[top]]=a[pos[top]]+(LL)val[i]; 
    30         stack[++top]=high[i];
    31         pos[top]=i;
    32     }
    33     top=0;
    34     for(int i=n;i>=1;--i) {
    35         while(top&&stack[top]<=high[i]) --top;
    36         a[pos[top]]+=(LL) val[i]; 
    37         stack[++top]=high[i];
    38         pos[top]=i;
    39     }
    40     for(int i=1;i<=n;++i)
    41       ans=max(ans,a[i]);
    42     printf("%lld
    ",ans);
    43     return 0;
    44 }
    45 
    46 int sb=hh();
    47 int main() {;}
    代码


    作者:乌鸦坐飞机
    出处:http://www.cnblogs.com/whistle13326/
    新的风暴已经出现 怎么能够停止不前 穿越时空 竭尽全力 我会来到你身边 微笑面对危险 梦想成真不会遥远 鼓起勇气 坚定向前 奇迹一定会出现

     
  • 相关阅读:
    Delphi中QuotedStr介绍及使用
    <<编写可维护的JavaScript>>之避免使用全局变量
    JavaScript中的继承模式总结(九)
    JavaScript中的继承(原型链)
    Javascript中函数的四种调用方式
    apply()和call()的区别
    在mui中遇到的内容覆盖导航栏的问题
    相等(==)运算符和等同(===)运算符之间的区别
    理解Javascript参数中的arguments对象
    Javascript之类型检测(一)
  • 原文地址:https://www.cnblogs.com/whistle13326/p/7388345.html
Copyright © 2011-2022 走看看