链接:登录—专业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;
}