题解 | #区间权值#
区间权值
https://ac.nowcoder.com/acm/problem/19798
求解:
定义:
换种角度,原命题转换为以r结尾长度为len的区间的所有和
所以:
#include <bits/stdc++.h>
using namespace std;
using ll = long long int;
using ull = unsigned long long int;
using pll = pair<ll, ll>;
const ll mod = 1e9 + 7;
void dilingtian()
{
int n;
cin >> n;
vector<long long> a(n + 1), w(n + 1), s(n + 1), sum(n + 1);
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++)
cin >> w[i];
for (int i = 1; i <= n; i++)
{
s[i] = s[i - 1] + a[i];
sum[i] = sum[i - 1] + s[i];
}
long long ans = 0;
for (int len = 1; len <= n; len++)
//sum[n]-sum[len-1]-sum[n-len]范围是1e7,w[len]也是1e7,如果直接相乘会爆掉long long
//所以采用先取余在相乘的做法
ans = (ans + (sum[n] - sum[len - 1] - sum[n - len] + mod) % mod * w[len] + mod) % mod;
cout << ans << endl;
}
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
// cin >> t;
t = 1;
while (t--)
dilingtian();
return 0;
}