zoukankan      html  css  js  c++  java
  • 3304 水果姐逛水果街Ⅰ

    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

    分类标签 Tags 点此展开 

     

    题解:

    对于一个区间,答案是(以从左往右走为例):

    max{右区间的最大值-左区间的最小值,左区间的答案,右区间的答案}

    因为有可能从右往左走,所以线段树记录:

    最大值,最小值,从左往右的答案,从右往左的答案。

    #include<bits/stdc++.h>
    using namespace std;
    #define N 200001
    #define lc k<<1
    #define rc k<<1|1
    #define mid (l+r>>1)
    struct ss{
        int maxn,minn,ans1,ans2;
    }a[N<<2];
    int xl[N],n,m;
    inline void updata(int k){
        a[k].maxn=max(a[lc].maxn,a[rc].maxn);
        a[k].minn=min(a[lc].minn,a[rc].minn);
        int t=a[rc].maxn-a[lc].minn; 
        int c=a[lc].maxn-a[rc].minn;
        a[k].ans1=max(t,max(a[lc].ans1,a[rc].ans1));
        a[k].ans2=max(c,max(a[rc].ans2,a[lc].ans2));
    }
    void build(int k,int l,int r){
        if(l==r){
            a[k].maxn=a[k].minn=xl[l];
            a[k].ans1=a[k].ans2=0;
            return;
        }
        build(lc,l,mid);
        build(rc,mid+1,r);
        updata(k);
    }
    ss query(int k,int l,int r,int x,int y){
        if(y<l||x>r) return (ss){-1,100000001,-1,-1};
        if(x<=l&&y>=r) return a[k];
        ss tmp1=query(lc,l,mid,x,y),tmp2=query(rc,mid+1,r,x,y),tmp;
        tmp.ans1=max(tmp1.ans1,max(tmp2.ans1,tmp2.maxn-tmp1.minn));
        tmp.ans2=max(tmp1.ans2,max(tmp2.ans2,tmp1.maxn-tmp2.minn));
        tmp.minn=min(tmp1.minn,tmp2.minn);
        tmp.maxn=max(tmp1.maxn,tmp2.maxn);
        return tmp;
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&xl[i]);
        build(1,1,n);
        scanf("%d",&m);
        for(int i=1,l,r;i<=m;i++){
            scanf("%d%d",&l,&r);
            if(l<=r)
                printf("%d
    ",query(1,1,n,l,r).ans1);
            else
                printf("%d
    ",query(1,1,n,r,l).ans2);
        }
        return 0;
    }   
  • 相关阅读:
    vscode配置c++以及美化插件
    自适应辛普森积分法
    [SDOI2014]数表
    [JSOI2009]等差数列
    MUI的踩坑笔记
    笔记:《吴恩达机器学习》——网易云课堂课程[绪论+单变量线性回归]
    CocoStuff—基于Deeplab训练数据的标定工具【五、训练成果分析】
    CocoStuff—基于Deeplab训练数据的标定工具【四、用该工具标定个人数据】
    CocoStuff—基于Deeplab训练数据的标定工具【三、标注工具的使用】
    CocoStuff—基于Deeplab训练数据的标定工具【二、用已提供的标注数据跑通项目】
  • 原文地址:https://www.cnblogs.com/shenben/p/5645128.html
Copyright © 2011-2022 走看看