水果姐逛水果街Ⅰ
时间限制: 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

n,m<=200000
写在前面:10个点跑了5s的煞笔代码
——————————————————————————————————————————————
思路:我会告诉你一上来我就看错题了吗?
调了半天才发现理解错题意了,不过改起来也不算太麻烦,主要就是对于一个区间内有序的最大差值的判断,就是max(左区间最大差值,右区间最大差值,左区间最大数值-右区间最小数值(或者右区间最大数值-左区间最小数值)),我的代码可能比较煞笔,大家凑活着看吧。
代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct node
{int maxn,minn,sum1,sum2;//sum1是指从左到右区间最大差值,sum2是从右到左区间最大差值
}tree[800010];
int n,q,head,tail;
int a[200010];
int in()
{int t=0;char ch=getchar();while (ch>'9'||ch<'0') ch=getchar();while (ch>='0'&&ch<='9') t=t*10+ch-'0',ch=getchar();return t;
}
void build_tree(int root,int begin,int end)
{if (begin==end) {tree[root].maxn=tree[root].minn=a[end];return;}int mid=(begin+end)/2;build_tree(root*2,begin,mid);build_tree(root*2+1,mid+1,end);tree[root].maxn=max(tree[root*2].maxn,tree[root*2+1].maxn);tree[root].minn=min(tree[root*2].minn,tree[root*2+1].minn);tree[root].sum1=max(max(tree[root*2].sum1,tree[root*2+1].sum1),tree[root*2+1].maxn-tree[root*2].minn);tree[root].sum2=max(max(tree[root*2].sum2,tree[root*2+1].sum2),tree[root*2].maxn-tree[root*2+1].minn);
}
int findmin(int root,int begin,int end)
{if (begin>tail||end<head) return 23333333;if (begin>=head&&end<=tail) return tree[root].minn;int mid=(begin+end)/2,t=0X7fffffff;if (mid>=head) t=min(t,findmin(root*2,begin,mid));if (mid<tail) t=min(t,findmin(root*2+1,mid+1,end));return t;
}
int findmax(int root,int begin,int end)
{if (begin>tail||end<head) return -23333333;if (begin>=head&&end<=tail) return tree[root].maxn;int mid=(begin+end)/2,t=-0X7fffffff;if (mid>=head) t=max(t,findmax(root*2,begin,mid));if (mid<tail) t=max(t,findmax(root*2+1,mid+1,end));return t;
}
int find1(int root,int begin,int end)
{if (begin>tail||end<head) return -1;if (begin>=head&&end<=tail) return tree[root].sum1;int mid=(begin+end)/2,t=0;if (mid>=head) t=max(find1(root*2,begin,mid),t);if (mid<tail) t=max(find1(root*2+1,mid+1,end),t);t=max(findmax(root*2+1,mid+1,end)-findmin(root*2,begin,mid),t);return t;
}
int find2(int root,int begin,int end)
{if (begin>tail||end<head) return -1;if (begin>=head&&end<=tail) return tree[root].sum2;int mid=(begin+end)/2,t=0;if (mid>=head) t=max(find2(root*2,begin,mid),t);if (mid<tail) t=max(find2(root*2+1,mid+1,end),t);t=max(findmax(root*2,begin,mid)-findmin(root*2+1,mid+1,end),t);return t;
}
main()
{n=in();for (int i=1;i<=n;i++) a[i]=in();build_tree(1,1,n);q=in();for (int i=1;i<=q;i++){head=in();tail=in();if (head>tail) swap(head,tail),printf("%d\n",find2(1,1,n)); else printf("%d\n",find1(1,1,n));}
}

【codevs3304】水果姐逛水果店Ⅰ,线段树练习相关推荐

  1. (WWWWWWWWWW)codevs 3305 水果姐逛水果街Ⅱ

    写这么长了不A有点舍不得.. 想A又调不出来.. 于是乎就存一下.. 屠龙宝刀点击就送 #include <cstdio> #include <vector> #define ...

  2. CDOJ1324-卿学姐与公主 【线段树点更新】

    http://acm.uestc.edu.cn/#/problem/show/1324 卿学姐与公主 Time Limit: 2000/1000MS (Java/Others)     Memory ...

  3. CDOJ 1292 卿学姐种花 暴力 分块 线段树

    卿学姐种花 题目连接: http://acm.uestc.edu.cn/#/problem/show/1292 Description 众所周知,在喵哈哈村,有一个温柔善良的卿学姐. 卿学姐喜欢和她一 ...

  4. 【BZOJ】1756: Vijos1083 小白逛公园(线段树)

    题目 传送门:QWQ 分析 线段树维护一下最大子序列 维护一下最大前缀 最大后缀  区间和 就ok了 好像只能用结构体..... 代码 #include <bits/stdc++.h> u ...

  5. 公园遛狗 / 小白逛公园【线段树】

    >Link ybtoj公园遛狗 luogu P4513 >解题思路 这道题我做的时候只想到了build.insert怎么写,ask看了书以后写的(真的好巧妙T) 单点修改+区间查询使我们想 ...

  6. 卿学姐与公主(线段树区间求最大值)

    A - 卿学姐与公主 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  7. CDOJ 1292 卿学姐种花(暴力,分块,线段树)

    众所周知,在喵哈哈村,有一个温柔善良的卿学姐. 卿学姐喜欢和她一样美丽的花.所以卿学姐家的后院有很多的花坛. 卿学姐有n 个花坛,一开始第 i个花坛里有 A[i] 朵花.每过一段时间,卿学姐都会在花坛 ...

  8. 卿学姐种花(线段树)

    卿学姐种花 Time Limit: 0/7500MS (Java/Others)     Memory Limit: 0/220000KB (Java/Others) 众所周知,在喵哈哈村,有一个温柔 ...

  9. P4513 小白逛公园 (线段树)

    题目链接 Solution 线段树是一门比较刁钻的手艺... 此题我们需要维护 \(4\) 个变量: \(amx\) 代表当前节点的最大值. \(lmx\) 代表当前节点以左端点为起点的区间最大值. ...

最新文章

  1. 在Ubuntu 16.04.5 LTS上使用python第三方库QRCode 6.0生成二维码实录
  2. Buffer.isBuffer()详解
  3. abap对采购订单强制置为”交货已完成“状态(BAPI_PO_CHANGE、BAPI_PO_RELEASE、BAPI_PO_RESET_RELEASE)
  4. html块状元素高度,CSS:如何计算块元素的高度?
  5. linux 查看文件哈希码,使用linux的sha1sum命令查看效验文件哈希值命令
  6. Xilinx实习一年总结
  7. Hadoop_10_HDFS 的 DataNode工作机制
  8. 数据挖掘导论学习---1
  9. SQL Server 2008入门系列之设置数据库服务器的访问权限
  10. 论文笔记_S2D.14-2014-NIPS_利用多尺度深度网络从单张图像预测深度图
  11. nginx代理内网服务器的图片服务器
  12. 使用FTP(IOS FTP客户端开发教程)
  13. 安徽科技学院 信网学院网络文化节 胡鑫
  14. 个人永久性免费-Excel催化剂功能第93波-地图数据挖宝之两点距离的路径规划
  15. Socket库函数介绍
  16. 【20180409】IT管理之IT十二条令
  17. 计算机硬件设置和驱动安装,电脑怎么安装驱动程序,如何安装驱动程序
  18. 80211无线网络权威指南(七)之RSN、TKIP与CCMP
  19. 参数优化类毕业论文文献有哪些?
  20. O泡恶搞v1.0安卓

热门文章

  1. 关于token你需要知道的
  2. 失去循环标记的Python,我这样实现跳出外层循环
  3. 【华为云技术分享】《跟唐老师学习云网络》 - Tcpdump大杀器抓包
  4. 语言在线组卷系统_如何使用在线考试系统创建题库?
  5. zookeeper3.5.x版本启动报错java.io.IOException: No snapshot found, but there are log entries.解决
  6. day9 java的静态代码块和代码执行顺序
  7. JDK配置与防火墙设置
  8. Java for循环改数据_如何改变arrs数组?当然是需用for循环啦
  9. redlock java_分布式Redis的分布式锁Redlock
  10. java 异常处理线程_转:Java子线程中的异常处理(通用)