题意:
给定长度为n的序列,a[i]代表第i位置的高度,从某个更高的位置走到更矮的位置会获得两者差值的下降伤害。m个询问,询问从s走到t的下降伤害。(s可能大于t)
数据量:1e5
思路:
标准前缀和的题。pre[i]维护从1走到i的伤害,lst[i],维护从n走到i的值。s<t就是往前走,用pre[t]-pre[s],否则为lst[t]-lst[s]
CODE:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long ll;
ll a[N],pre[N],lst[N];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;++i){
cin>>a[i];
if(i>1) pre[i]=pre[i-1]+max((ll)0,a[i-1]-a[i]);
}
for(int i=n-1;i>=1;--i) lst[i]=lst[i+1]+max((ll)0,a[i+1]-a[i]);
while(m--){
int s,t;
cin>>s>>t;
if(s==t) puts("0");
else if(s>t) cout<<lst[t]-lst[s]<<endl;
else cout<<pre[t]-pre[s]<<endl;
}
return 0;
}