2018 Wannafly summer camp Day8--区间权值

区间权值
小Bo有n个正整数a1……an,以及一个权值序列w1……wn,现在她定义f(l,r)=(i=lrai2)wrl+1
现在他想知道l=1nr=lnf(l,r)的值,需要你来帮帮他,你只需要输出答案对109+7取模后的值。
输入格式
第一行一个正整数n
第二行n个整数a1……an
第三行n个整数a1……an
输出格式
输出答案109+7取模
样例输入
3
1 1 1
1 1 1
样例输出
10
数据范围
1<=n<=3105
1<=ai<=107
1<=wi<=107

思路:
f(l,r)=(i=lrai2)wrl+1展开如下:

(a1w1(a1+a2)w2a2w1(a1+a2+a3)w3(a2+a3)w2a3w1(a1+a2+a3+a4)w4(a2+a3+a4)w3(a3+a4)w2(a1+a2++an)wn(a2++an)wn1anw1)

从第一列可以想到前缀和,所以先求出前缀和f[i](0<=i<=n)

((f1f0)w1(f2f0)w2(f2f1)w1(f3f0)w3(f3f1)w2(f3f2)w1(f4f0)w4(f4f1)w3(f4f2)w2(fnf0)wn(fnf1)wn1(fnfn1)w1)

然后将wi相同的项合(可以相互消去)并描绘得到下面的东西,为了方便,我还是用矩阵表示

((fn)w1(fn+fn1f1)w3(fn+fn1+fn2f1f2)w3(fn+fn1+fn2+fn3f1f2f3)w4fn+fn1+f1f2fn1wn)

现在敲是会TLE的,复杂度太高
所以再考虑一次fi的前缀和gi,
上面就可以将fi转换成g[n]g[ni]g[i1]
还有一个问题,由于有减法,所以可能答案出现负数,所以最后需要加模再取模。

#include <cstdio>
#include <cstring>
#include <cmath>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const ll mo=1e9+7;
const int maxn=3e5+5;
ll a[maxn],w[maxn],f[maxn],g[maxn],ans=0;
int main()
{
	int n;
	scanf("%d",&n);
	g[0]=f[0]=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        f[i]=a[i]+f[i-1];
        g[i]=(f[i]+g[i-1])%mo;
    }
    for(int i=1;i<=n;i++)
        cin>>w[i];
    for(int i=1;i<=n;i++){
        ans=(ans+(g[n]-g[n-i]-g[i-1])*w[i]%mo)%mo;
    }
    cout<<(ans+mo)%mo<<endl;
    return 0;
}
posted @   Chasssser  阅读(323)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示