UPC-9558 區間權值
阿新 • • 發佈:2018-11-01
題目:小Bo有n個正整數a1..an,以及一個權值序列w1…wn,現在他定義
現在他想知道的值,需要你來幫幫他
你只需要輸出答案對109+7取模後的值
輸入
第一行一個正整數n
第二行n個正整數a1..an
第三行n個正整數w1..wn
1≤n≤3×105
1≤ai≤107
1≤wi≤107
輸出
輸出答案對109+7取模後的值
題解:對每一個w[i],算一下所有包含它的區間的a的和sum。
AC程式碼:
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <queue> #include <stack> #include <vector> #include <map> #include <set> using namespace std; #define io ios::sync_with_stdio(0),cin.tie(0) #define ms(arr) memset(arr,0,sizeof(arr)) #define inf 0x3f3f3f typedef long long ll; const int mod=1e9+7; const int maxn=3e5+7; ll n; ll a[maxn],w[maxn]; int main() { io; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; a[i]=a[i]+a[i-1]; } for(int i=1;i<=n;i++) cin>>w[i]; ll l=1,r=n; ll sum=0; ll ans=0; while(l<=r) { sum=(sum+a[r]-a[l-1])%mod; if(l<r) ans=(ans+sum*w[l]+sum*w[r])%mod; else ans=(ans+sum*w[l])%mod; l++;r--; } cout<<ans<<endl; return 0; }