水果姐逛水果街1(codevs3304)(dp+线段树)

题目描述 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

#include<iostream>#include<cstdio>using namespace std;struct use{ int maxx,minn,z,f;}t[10000001];int v[100001],a,b,ans,n,m;void build(int x,int l,int r){int m;if (l==r){t[x].maxx=t[x].minn=v[l];return;}m=(l+r)/2;build(x*2,l,m);build(x*2+1,m+1,r);t[+1].maxx);t[+1].minn);t[+].minn));t[++1].minn));}struct use query(int x,int l,int r){ struct use tl,tr,tt; int m; if (r<a||l>b) return (use){-1,1000000000,-1,-1}; if (a<=l&&r<=b)return t[x]; m=(l+r)/2; tl=query(x*2,l,m); tr=query(x*2+1,m+1,r); tt.maxx=max(tl.maxx,tr.maxx); tt.minn=min(tl.minn,tr.minn); tt.z=max(max(tl.z,tr.z),tr.maxx-tl.minn); tt.f=max(max(tl.f,tr.f),tl.maxx-tr.minn); return tt;}int main(){scanf(“%d”,&n);for (int i=1;i<=n;i++)scanf(“%d”,&v[i]);build(1,1,n);scanf(“%d”,&m);for (int i=1;i<=m;i++){struct use ans;scanf(“%d%d”,&a,&b);if (a==b) printf(“%d\n”,0);if (a<b){ans=query(1,1,n);printf(“%d\n”,ans.z);}if (a>b){swap(a,b);ans=query(1,1,n);printf(“%d\n”,ans.f);}}}

鱼儿爱美,不仅需要鳞甲之美。还需要浮沉活泼之美。

水果姐逛水果街1(codevs3304)(dp+线段树)

相关文章:

你感兴趣的文章:

标签云: