最優貿易簡化版

最優貿易簡化版

題目描述
C國有n座城市,編號是1到n,編號爲i的城市有路到編號爲i+1的城市(編號爲n的城市沒有路到其他的城市)。
C國幅員遼闊,各地的資源分佈情況各不相同,這就導致了同一種商品在不同城市的價格不一定相同。但是,同一種商品在同一個城市的買入價和賣出價始終是相同的。
商人阿龍再次來到C國旅遊。他還是想販賣水晶賺取旅費,在某個城市買入,再另一個城市賣出。
他將從編號爲a的城市到編號到b的城市。請你幫他算算,最多能賺多少錢。
注:他最多進行一次買入和一次賣出。
輸入
第一行兩個整數n和m,表示n個城市和m個詢問。
第二行n個整數,表示n座城市水晶的買入和賣出的價格。
接下來m行,每行兩個整數a、b,表示阿龍要從編號爲a的城市到編號爲b的城市(a< b);
輸出
對於每個詢問輸出阿龍能賺多少錢。
樣例輸入
6 3
2 1 3 6 4 5
1 2
2 4
1 6
樣例輸出
0
5
5
提示
【輸出輸出樣例解釋】

從1到2,無法賺錢。

從2到4,在編號爲2的城市買入,在編號爲4的城市賣出。

從1到6,在編號爲2的城市買入,在編號爲4的城市賣出。

對於20%的數據,n和m的範圍[1,500];

對於40%的數據,n和m的範圍[1,5000];

【數據範圍】

對於20%的數據,n和m的範圍[1,500];

對於40%的數據,n和m的範圍[1,5000];

對於70%的數據,n和m的範圍[1,50000];

對於100%的數據,n和m的範圍[1,500000];




1.lmid

2.mid+1r

3.l,midmid+1r

3

我是用樹做的^-^
#include<iostream>
#include<cstdio>
using namespace std;
struct node{
  int a,b,c;
}tree[2000010];
int a[500010];
void dfs(int l,int r,int z){
  if (l==r){
    tree[z].a=a[l];
    tree[z].b=a[l];
    tree[z].c=0;
    return;  
  }
  int mid=(l+r)>>1;
  dfs(l,mid,z+z);
  dfs(mid+1,r,z+z+1);
  tree[z].a=min(tree[z+z].a,tree[z+z+1].a);
  tree[z].b=max(tree[z+z].b,tree[z+z+1].b);
  tree[z].c=max(tree[z+z+1].b-tree[z+z].a,max(tree[z+z].c,tree[z+z+1].c));
}
node query(int l,int r,int z,int x,int y){
  if (l>=x&&r<=y) return tree[z];
  if (l>y||r<x) return (node){1<<29,-1<<29,0};
  int mid=(l+r)>>1;
  node xx=query(l,mid,z+z,x,y);
  node yy=query(mid+1,r,z+z+1,x,y);
  return (node){min(xx.a,yy.a),max(xx.b,yy.b),max(yy.b-xx.a,max(xx.c,yy.c))};
}
int main(){
  int n,m;
  scanf("%d%d",&n,&m);
  for (int i=1;i<=n;++i) scanf("%d",&a[i]);
  dfs(1,n,1);
  while (m--){
    int x,y;
    scanf("%d%d",&x,&y);
    printf("%d\n",query(1,n,1,x,y).c);
  }
  return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章