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

/*
这一道题是有一排商店,可以买水果也可以卖水果,买水果和卖水果的价钱一样。
问你从商店x走到商店y,买卖所得最大收益是多少。
我们可以发现朴素的办法是一路扫过去,记录当前最小值,然后更新收益。
这样应该会T(我没试过) 这样丢失了很多信息。
我们考虑一下能不能存起来。 发现解满足区间加法。
即【L,R】中最大的收益要么是【L,K】中的收益,要么是【K,R】中的收益(端点重合不影响),要么是【K,R】中的最大值减去【L,K】中的最小值。
这是针对从左往右走的。
于是乎我们可以用线段树来维护这些信息。
因为我们有可能从左往右走,也可能从右往左走,所以记个f数组,f[0]表示从线段树中下标小的向下标大的走所得的最大收益。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 200010
#define inf 0x7fffffff using namespace std;
int n,m,num,a[maxn];
struct node
{
int lc,rc;
int l,r;
int smin,smax;
int ansl,ansr;
}t[maxn*]; int init()
{
int x=;char s;bool f=;s=getchar();
while(s<''||s>'')s=getchar();
while(s>=''&&s<='')
{
x=x*+s-'';
s=getchar();
}
return x;
} void update(int k)
{
t[k].smin=min(t[t[k].lc].smin,t[t[k].rc].smin);
t[k].smax=max(t[t[k].lc].smax,t[t[k].rc].smax);
t[k].ansl=max(t[t[k].lc].ansl,t[t[k].rc].ansl);
t[k].ansl=max(t[k].ansl,t[t[k].rc].smax-t[t[k].lc].smin);
t[k].ansr=max(t[t[k].lc].ansr,t[t[k].rc].ansr);
t[k].ansr=max(t[k].ansr,t[t[k].lc].smax-t[t[k].rc].smin);
} void Build(int ll,int rr)
{
int k=++num;
t[k].l=ll;t[k].r=rr;
if(ll==rr)
{
t[k].smin=t[k].smax=a[ll];
return;
}
t[k].lc=num+;
Build(ll,(ll+rr)/);
t[k].rc=num+;
Build((ll+rr)/+,rr);
update(k);
} int findmin(int k,int ll,int rr)
{
if(ll==t[k].l&&rr==t[k].r)return t[k].smin;
int mid=(t[k].l+t[k].r)/;
if(rr<=mid)return findmin(t[k].lc,ll,rr);
else if(ll>mid)return findmin(t[k].rc,ll,rr);
else return min(findmin(t[k].lc,ll,mid),findmin(t[k].rc,mid+,rr));
} int findmax(int k,int ll,int rr)
{
if(ll==t[k].l&&rr==t[k].r)return t[k].smax;
int mid=(t[k].l+t[k].r)/;
if(rr<=mid)return findmax(t[k].lc,ll,rr);
else if(ll>mid)return findmax(t[k].rc,ll,rr);
else return max(findmax(t[k].lc,ll,mid),findmax(t[k].rc,mid+,rr));
} int findl(int k,int ll,int rr)
{
if(ll==t[k].l&&rr==t[k].r)return t[k].ansl;
int mid=(t[k].l+t[k].r)/;
if(rr<=mid)return findl(t[k].lc,ll,rr);
else if(ll>mid)return findl(t[k].rc,ll,rr);
else
{
int maxx=;
maxx=max(findl(t[k].lc,ll,mid),findl(t[k].rc,mid+,rr));
maxx=max(maxx,findmax(t[k].rc,mid+,rr)-findmin(t[k].lc,ll,mid));
return maxx;
}
} int findr(int k,int ll,int rr)
{
if(ll==t[k].l&&rr==t[k].r)return t[k].ansr;
int mid=(t[k].l+t[k].r)/;
if(rr<=mid)return findr(t[k].lc,ll,rr);
else if(ll>mid)return findr(t[k].rc,ll,rr);
else
{
int maxx=;
maxx=max(findr(t[k].lc,ll,mid),findr(t[k].rc,mid+,rr));
maxx=max(maxx,findmax(t[k].lc,ll,mid)-findmin(t[k].rc,mid+,rr));
return maxx;
}
} int main()
{
n=init();
for(int i=;i<=n;i++)
a[i]=init();
for(int i=;i<=maxn*;i++)
t[i].smin=inf;
Build(,n);
int x,y;
m=init();
for(int i=;i<=m;i++)
{
x=init();y=init();
if(x==y)
{
printf("0\n");
continue;
}
if(x<y)printf("%d\n",findl(,x,y));
else printf("%d\n",findr(,y,x));
}
return ;
}

心若向阳,无言悲伤

codevs3304水果姐逛街(线段数)的更多相关文章

  1. codevs3304 水果姐逛水果街

    题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了 ...

  2. codevs3304 水果姐逛水果街Ⅰ

    题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了 ...

  3. codevs3304水果姐逛水果街

    /* 线段树开到*4 *4 *4 *4 ! 维护 4个值 区间最大值 区间最小值 从左往右跑最大收益 从右往左跑最大收益 */ #include<iostream> #include< ...

  4. 水果姐逛水果街Ⅱ codevs 3305

    3305 水果姐逛水果街Ⅱ  时间限制: 2 s  空间限制: 256000 KB   题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔 ...

  5. code vs 3305 水果姐逛水果街Ⅱ

    3305 水果姐逛水果街Ⅱ  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 水果姐第二天心情也很不错, ...

  6. Codevs 3304 水果姐逛水果街Ⅰ 线段树

    题目: http://codevs.cn/problem/3304/   时间限制: 2 s   空间限制: 256000 KB   题目等级 : 钻石 Diamond 题解       题目描述 D ...

  7. codevs3305 水果姐逛水果街Ⅱ

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  8. Codevs 3305 水果姐逛水果街Ⅱ 倍增LCA

    题目:http://codevs.cn/problem/3305/  时间限制: 2 s   空间限制: 256000 KB   题目等级 : 钻石 Diamond 题解       题目描述 Des ...

  9. codevs 3305 水果姐逛水果街Ⅱ&&codevs3006

    题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔法,水果街变成了树结构(店与店之间只有一条唯一的路径). 同样还是n家水果店,编号为1~ ...

随机推荐

  1. Educational Codeforces Round 57 (Rated for Div. 2) 前三个题补题

    感慨 最终就做出来一个题,第二题差一点公式想错了,又是一波掉分,不过我相信我一定能爬上去的 A Find Divisible(思维) 上来就T了,后来直接想到了题解的O(1)解法,直接输出左边界和左边 ...

  2. Linux 下 Bash 脚本对拍

    背会... #!/bin/bash i= while true ;do ./maker > data.in ./a <data.in> data.out ./b <data.i ...

  3. freopen的各种错误姿势

    本弱鸡已经触发的错误姿势: freoprn("railway.in","r",stdin); freopen("railway.cpp",& ...

  4. Linux—Ubuntu14.0.5配置JAVA环境

    1. 前往ORACLE官网下载最新版本的Java JDK:http://www.oracle.com/technetwork/java/javase/downloads/index.html,默认下载 ...

  5. 《hello-world》第八次团队作业:Alpha冲刺

    项目 内容 这个作业属于哪个课程 2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十二 团队作业8:软件测试与Alpha冲刺 团队名称 <hello--worl ...

  6. [luoguP2434] [SDOI2005]区间(贪心)

    传送门 简单贪心 ——代码 #include <cstdio> #include <iostream> #include <algorithm> int n, l, ...

  7. noip模拟赛 寻宝之后

    题目背景 还记得NOIP2011的寻宝吗?6年之后,小明带着他的妹子小芳,再次走上了寻宝的道路. 然而这次他们寻宝回来之后,小明被困在了一个迷宫中. 题目描述 迷宫是一个n*m的字符矩阵. 小明在这个 ...

  8. spoj 375 树链剖分模板

    /* 只是一道树链刨分的入门题,作为模板用. */ #include<stdio.h> #include<string.h> #include<iostream> ...

  9. 利用python进行数据分析--(阅读笔记一)

    以此记录阅读和学习<利用Python进行数据分析>这本书中的觉得重要的点! 第一章:准备工作 1.一组新闻文章可以被处理为一张词频表,这张词频表可以用于情感分析. 2.大多数软件是由两部分 ...

  10. Fast Matrix Calculation 矩阵快速幂

    One day, Alice and Bob felt bored again, Bob knows Alice is a girl who loves math and is just learni ...