NC19798 区间权值(前缀和)

枚举w

根据长度的增加,其实相当于变成某一段区间能多加几次

而到了最高点后又会下降,加的次数会变少,因此维护这个数据即可

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const int N=3e5+10;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
ll a[N];
ll w[N];
ll sum[N];
int main(){
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    int i;
    for(i=1;i<=n;i++){
        cin>>a[i];
        sum[i]=(sum[i-1]+a[i])%mod;
    }
    for(i=1;i<=n;i++){
        cin>>w[i];
    }
    ll ans=0;
    ll s=0;
    for(i=1;i<=n;i++){
        s=(s+sum[n-i+1]-sum[i-1]+mod)%mod;
        ans=(ans+w[i]*s)%mod;
    }
    cout<<ans<<endl;
    return 0;
}
View Code

 

posted @ 2021-02-22 10:51  朝暮不思  阅读(73)  评论(0)    收藏  举报