枚举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; }