博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
牛客国庆集训派对Day4——G 区间权值(找规律,双重前缀和)
阅读量:2135 次
发布时间:2019-04-30

本文共 840 字,大约阅读时间需要 2 分钟。

题目链接:

题目大意:

      小 Bo 有 n 个正整数 a1..an,以及一个权值序列 w1…wn,现在他定义
      现在他想知道 的值,需要你来帮帮他。你只需要输出答案对 109+7 取模后的值

题解:

题目要求的是

 f(1,1)+f(1,2)+f(1,3)+...+f(1,n)

f(2,2)+f(2,3)+...+f(2,n)

f(3,3)+f(3,4)+...+f(3.n)

f(4,4)+f(4,5)...

...

f(n,n)

sum[1]w1\ + \ sum[2]w2\ +\ sum[3]w3+...\ +\ sum[n]wn

(sum[2]-sum[1])w1+(sum[3]-sum[1])w2+...+(sum[n]-sum[1])w_{n-1}

(sum[3]-sum[2])w1+(sum[4]-sum[2])w2+...+(sum[n]-sum[2])w_{n-1}

可以发现每一行的对应列的w因数相同,对应相加可得

w1(sum[n])

w2(sum[n]-sum[n-1]-sum[1])

w3(sum[n]-sm[n-1]-sum[n-2]-sum[2]-sum[1])

但是这样求的话也是需要两重循环来求......于是再来一次前缀和(S[n]为sum的前缀)

即  wi(S_{n}-S_{n-i}-S_{i-1})

#include 
#include
#include
#include
#include
#define mod 1000000007using namespace std;typedef long long ll;ll sum[300010];ll S[300010];int a[300010],w[300010];int main(){ //freopen("input.txt","r",stdin); int n; scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i]; } for(int i=1;i<=n;++i) scanf("%d",&w[i]); for(int i=1;i<=n;++i) S[i]=S[i-1]+sum[i],S[i]%=mod; ll ans=0; for(int i=1;i<=n;++i) { ans+=((S[n]-S[n-i]-S[i-1]+mod)%mod*w[i]%mod)%mod; ans%=mod; } printf("%lld\n",ans); return 0;}

 

转载地址:http://ykfgf.baihongyu.com/

你可能感兴趣的文章
Linux下查看根目录各文件内存占用情况
查看>>
A星算法详解(个人认为最详细,最通俗易懂的一个版本)
查看>>
利用栈实现DFS
查看>>
逆序对的数量(递归+归并思想)
查看>>
数的范围(二分查找上下界)
查看>>
算法导论阅读顺序
查看>>
Windows程序设计:直线绘制
查看>>
linux之CentOS下文件解压方式
查看>>
Django字段的创建并连接MYSQL
查看>>
div标签布局的使用
查看>>
HTML中表格的使用
查看>>
(模板 重要)Tarjan算法解决LCA问题(PAT 1151 LCA in a Binary Tree)
查看>>
(PAT 1154) Vertex Coloring (图的广度优先遍历)
查看>>
(PAT 1115) Counting Nodes in a BST (二叉查找树-统计指定层元素个数)
查看>>
(PAT 1143) Lowest Common Ancestor (二叉查找树的LCA)
查看>>
(PAT 1061) Dating (字符串处理)
查看>>
(PAT 1118) Birds in Forest (并查集)
查看>>
数据结构 拓扑排序
查看>>
(PAT 1040) Longest Symmetric String (DP-最长回文子串)
查看>>
(PAT 1145) Hashing - Average Search Time (哈希表冲突处理)
查看>>