因为只能带一个,买卖价格又一样,所以只要右边的比左边的大,就从这买下来然后带到下一个卖掉就行了(我想到别处再卖的话大不了再重新买回来嘛)
所以给max(w[i]-w[i-1],0)维护一个前缀和就行了
1 #include<bits/stdc++.h> 2 #define pa pair<int,int> 3 #define CLR(a,x) memset(a,x,sizeof(a)) 4 using namespace std; 5 typedef long long ll; 6 const int maxn=1e6+10; 7 8 inline ll rd(){ 9 ll x=0;char c=getchar();int neg=1; 10 while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();} 11 while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar(); 12 return x*neg; 13 } 14 15 int N,M; 16 ll s[maxn]; 17 18 int main(){ 19 //freopen(".in","r",stdin); 20 int i,j,k; 21 N=rd(); 22 for(i=2,j=rd();i<=N;i++){ 23 k=rd(); 24 s[i]=s[i-1]+max(k-j,0); 25 j=k; 26 }M=rd(); 27 for(i=1;i<=M;i++){ 28 int l=rd(),r=rd(); 29 printf("%lld ",s[r]-s[l]); 30 } 31 return 0; 32 }