• Codevs 3304 水果姐逛水果街Ⅰ 线段树


     
    时间限制: 2 s 
     空间限制: 256000 KB 
     题目等级 : 钻石 Diamond
     
     
     
    题目描述 Description

    水果姐今天心情不错,来到了水果街。

    水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样。

    学过oi的水果姐迅速发现了一个赚钱的方法:在某家水果店买一个水果,再到另外一家店卖出去,赚差价。

    就在水果姐窃喜的时候,cgh突然出现,他为了为难水果姐,给出m个问题,每个问题要求水果姐从第x家店出发到第y家店,途中只能选一家店买一个水果,然后选一家店(可以是同一家店,但不能往回走)卖出去,求每个问题中最多可以赚多少钱。

    输入描述 Input Description

    第一行n,表示有n家店

    下来n个正整数,表示每家店一个苹果的价格。

    下来一个整数m,表示下来有m个询问。

    下来有m行,每行两个整数x和y,表示从第x家店出发到第y家店。

    输出描述 Output Description

    有m行。

    每行对应一个询问,一个整数,表示面对cgh的每次询问,水果姐最多可以赚到多少钱。

    样例输入 Sample Input

    10
    2 8 15 1 10 5 19 19 3 5 
    4
    6 6
    2 8
    2 2
    6 3

    样例输出 Sample Output

    0
    18
    0
    14

    数据范围及提示 Data Size & Hint

    0<=苹果的价格<=10^8

    0<n,m<=200000

    题解:

    记录从左开始(左买右卖)最大利润和从右开始(右买左卖)最大利润,还有在每个子树价格的最大最小值。

    则从左往右最大利润为:1.左子树最大利润。

           2.右子树最大利润。

           3.右子树最大值-左子树最小值。

    从右往左同理。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define MAXN 200010
     4 #define INF 1e9
     5 struct node
     6 {
     7     int mx,mn,lc,rc,left,right,val;
     8 }tree[MAXN*4];
     9 int a[MAXN];
    10 int read()
    11 {
    12     int s=0,fh=1;char ch=getchar();
    13     while(ch<'0'||ch>'9'){if(ch=='-')fh=-1;ch=getchar();}
    14     while(ch>='0'&&ch<='9'){s=s*10+(ch-'0');ch=getchar();}
    15     return s*fh;
    16 }
    17 void Pushup(int k)
    18 {
    19     tree[k].mx=max(tree[k*2].mx,tree[k*2+1].mx);
    20     tree[k].mn=min(tree[k*2].mn,tree[k*2+1].mn);
    21     tree[k].lc=max(tree[k*2].lc,tree[k*2+1].lc);
    22     tree[k].lc=max(tree[k].lc,tree[k*2+1].mx-tree[k*2].mn);
    23     tree[k].rc=max(tree[k*2].rc,tree[k*2+1].rc);
    24     tree[k].rc=max(tree[k].rc,tree[k*2].mx-tree[k*2+1].mn);
    25 }
    26 void Build(int k,int l,int r)
    27 {
    28     tree[k].left=l;tree[k].right=r;
    29     if(l==r)
    30     {
    31         tree[k].val=a[l];tree[k].lc=tree[k].rc=0;tree[k].mx=a[l];tree[k].mn=a[l];
    32         return;
    33     }
    34     int mid=(l+r)/2;
    35     Build(k*2,l,mid);Build(k*2+1,mid+1,r);
    36     Pushup(k);
    37 }
    38 int MAX1(int k,int ql,int qr)
    39 {
    40     if(ql<=tree[k].left&&tree[k].right<=qr)return tree[k].mx;
    41     int mid=(tree[k].left+tree[k].right)/2;
    42     if(qr<=mid)return MAX1(k*2,ql,qr);
    43     else if(ql>mid)return MAX1(k*2+1,ql,qr);
    44     else return max(MAX1(k*2,ql,mid),MAX1(k*2+1,mid+1,qr));
    45 }
    46 int MIN1(int k,int ql,int qr)
    47 {
    48     if(ql<=tree[k].left&&tree[k].right<=qr)return tree[k].mn;
    49     int mid=(tree[k].left+tree[k].right)/2;
    50     if(qr<=mid)return MIN1(k*2,ql,qr);
    51     else if(ql>mid)return MIN1(k*2+1,ql,qr);
    52     else return min(MIN1(k*2,ql,mid),MIN1(k*2+1,mid+1,qr));
    53 }
    54 int Query1(int k,int ql,int qr)
    55 {
    56     if(ql<=tree[k].left&&tree[k].right<=qr)return tree[k].lc;
    57     int mid=(tree[k].left+tree[k].right)/2;
    58     if(qr<=mid)return Query1(k*2,ql,qr);
    59     else if(ql>mid)return Query1(k*2+1,ql,qr);
    60     else
    61     {
    62         int MAX=-INF;
    63         MAX=max(MAX,max(Query1(k*2,ql,mid),Query1(k*2+1,mid+1,qr)));
    64         MAX=max(MAX,MAX1(k*2+1,mid+1,qr)-MIN1(k*2,ql,mid));
    65         return MAX;
    66     }
    67 }
    68 int Query2(int k,int ql,int qr)
    69 {
    70     if(ql<=tree[k].left&&tree[k].right<=qr)return tree[k].rc;
    71     int mid=(tree[k].left+tree[k].right)/2;
    72     if(qr<=mid)return Query2(k*2,ql,qr);
    73     else if(ql>mid)return Query2(k*2+1,ql,qr);
    74     else
    75     {
    76         int MAX=-INF;
    77         MAX=max(MAX,max(Query2(k*2,ql,mid),Query2(k*2+1,mid+1,qr)));
    78         MAX=max(MAX,MAX1(k*2,ql,mid)-MIN1(k*2+1,mid+1,qr));
    79         return MAX;
    80     }
    81 }
    82 int main()
    83 {
    84     int n,i,m,x,y;
    85     n=read();
    86     for(i=1;i<=n;i++)a[i]=read();
    87     Build(1,1,n);
    88     m=read();
    89     for(i=1;i<=m;i++)
    90     {
    91         x=read();y=read();
    92         if(x==y)printf("0
    ");
    93         else if(x<y)printf("%d
    ",Query1(1,x,y));
    94         else printf("%d
    ",Query2(1,y,x));
    95     }
    96     return 0;
    97 }
    View Code
  • 相关阅读:
    dedecms likearticle 调用附加表的字段调用方式
    织梦dedecms自定义字段在首页列表页文章页的调用
    织梦系统站点首页、列表、文章页等页面点击数调用方法
    dedecms友情链接flink的调用方法
    织梦dedecms5.7后台进去就卡死解决方法
    Dede修改文章默认标题长度,让标题全显示
    dede调用时间大全标签,不同格式!
    dede调用指定栏目的标签
    python time模块的使用
    phpstudy 环境使用Composer安装thinkphp并指定版本
  • 原文地址:https://www.cnblogs.com/Var123/p/5275722.html
Copyright © 2020-2023  润新知