【线段树】【分类讨论】水果姐逛水果街Ⅰ
来源:互联网 发布:不想做程序员了 太累了 编辑:程序博客网 时间:2024/04/29 12:04
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
102 8 15 1 10 5 19 19 3 5 46 62 82 26 3
样例输出 Sample Output
018014
数据范围及提示 Data Size & Hint
0<=苹果的价格<=10^80<n,m<=200000
题解:
显而易见的线段树。维护一下区间最大值、最小值,从前向后走的最大差值,和从后向前的最大差值。只是在查询的时候需要分类讨论一下,有点恶心。。
Code:
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#define root 1,1,n#define lchild rt<<1,l,m#define rchild rt<<1|1,m+1,rusing namespace std;struct Tree{ int maxn,minn,chaq,chah;}tree[1000010];int n,q;int in(){ int x=0; char ch=getchar(); while (ch<'0' || ch>'9') ch=getchar(); while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar(); return x;}void push_up(int rt){ tree[rt].maxn=max(tree[rt<<1].maxn,tree[rt<<1|1].maxn); tree[rt].minn=min(tree[rt<<1].minn,tree[rt<<1|1].minn); int q=tree[rt<<1].maxn-tree[rt<<1|1].minn,h=tree[rt<<1|1].maxn-tree[rt<<1].minn; tree[rt].chaq=max(q,max(tree[rt<<1].chaq,tree[rt<<1|1].chaq)); tree[rt].chah=max(h,max(tree[rt<<1].chah,tree[rt<<1|1].chah));}void build(int rt,int l,int r){ if (l==r){ tree[rt].maxn=tree[rt].minn=in(); tree[rt].chaq=tree[rt].chah=0; return; } int m=(l+r)>>1; build(lchild); build(rchild); push_up(rt);}Tree query(int rt,int l,int r,int ll,int rr){ if (ll<=l && r<=rr) return (Tree)tree[rt]; int m=(l+r)>>1; Tree s1,s2,s3; s1=s2=s3=(Tree){0,0x7fffffff,0,0}; if (ll<=m) s1=(Tree)query(lchild,ll,rr); if (rr>m) s2=(Tree)query(rchild,ll,rr); s3.maxn=max(s1.maxn,s2.maxn); s3.minn=min(s1.minn,s2.minn); s3.chaq=max(max(s1.chaq,s2.chaq),s1.maxn-s2.minn); s3.chah=max(max(s1.chah,s2.chah),s2.maxn-s1.minn); return s3;}int main(){ n=in(); build(root); q=in(); while (q--){ int x=in(),y=in(),ans; if (x==y) ans=0; else if (x<y) ans=query(root,x,y).chah; else ans=query(root,y,x).chaq; printf("%d\n",ans); } return 0;}
1 0
- 【线段树】【分类讨论】水果姐逛水果街Ⅰ
- 【树上倍增】【分类讨论】水果姐逛水果街Ⅱ
- 【树链剖分】【分类讨论】水果姐逛水果街Ⅲ
- 【codevs3304】水果姐逛水果街Ⅰ 线段树练习
- 【线段树】codevs 3304 水果姐逛水果街
- CodeVS 3304 水果姐逛水果街Ⅰ(线段树)
- Codevs_P3304 水果姐逛水果街Ⅰ(线段树+区间DP)
- codevs 3304 水果姐逛水果街Ⅰ(线段树)
- <线段树版>codevs 3304 水果姐逛水果街Ⅰ
- 形形色色的水果姐逛水果街——codevs水果姐逛水果街1-3:线段树与ST表
- 【codvs3304 3305 3306】水果姐逛水果街系列【线段树】【树链剖分】
- 水果姐逛水果街1(codevs3304)(dp+线段树)
- CODE[VS] 3304 水果姐逛水果街I(线段树求区间最大最小值)
- CODE[VS]3306 水果姐逛水果街3 树链剖分+线段树
- 【codevs3304】水果姐逛水果店Ⅰ,线段树练习
- Codevs3304水果姐逛水果街Ⅰ题解
- codevs 3304 水果姐逛水果街Ⅰ 题解
- codevs 3304 水果姐逛水果街Ⅰ 解题记录
- HTML设为首页/加入收藏代码
- 运营管理平台商品增加脚本 不同类型弹窗+多层iframe
- springMVC maven的pom.xml配置文件参考
- iOS应用架构谈 view层的组织和调用方案
- 用遗传算法求解TSP问题
- 【线段树】【分类讨论】水果姐逛水果街Ⅰ
- python装饰器理解
- reason: -[UIKBBlurredKeyView candidateList]: unrecognized selector sent to instance
- 从客户端检测到有潜在危险的Request.Form值
- C#多线程开发6:使用lock语句同步多个线程
- 关于DM814x系统学习
- Java NIO系列教程(九) ServerSocketChannel
- uva 10976
- 基于Qt下移动平台第三方接入-ShareSDK(新浪微博,微信朋友圈等分享登录)