
 链接:登录—专业IT笔试面试备考平台_牛客网
 来源:牛客网
  
示例1
输入
4 1 2
1 1 4 5
2 2 2 3
4输出
10说明
在第4格放出水流后,水流会流向第3格,由于第3格高度比第4格低,所以水流继续向左流向第2格,因为平地水流只能流2格,所以到达第2格后水流停止,收获的小麦数量为1 + 4 + 5 = 10
示例2
输入
5 2 2
1 1 4 5 1
2 2 3 3 4
4
3输出
9
6解析:
1e5每次遍历肯定超时,f 数组记录当前的位置最低能够流到的位置,输出前缀和差即可。
f 数组的计算需要特别注意,此处需着重学习。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
ll n,q,k,a[N],h[N],x,sum[N],f[N],l;
int main(){
	scanf("%lld%lld%lld",&n,&q,&k);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		sum[i]=sum[i-1]+a[i];	
	}
	for(int i=1;i<=n;i++){
		scanf("%lld",&h[i]);
		if(h[i]>h[i-1]) l=1,f[i]=1;
		else f[i]=l;
		l++;
		if(f[i]<k) f[i]=f[i-1];
		else f[i]=i-k+1;
	}
	while(q--){
		scanf("%lld",&x);
		printf("%lld\n",sum[x]-sum[f[x]-1]);
	}
	return 0;
}


















