51Nod - 1081 子段求和 前缀和算法
2017-06-20 17:33
337 查看
真是要炸,一个题看起来挺常规但oj就是一直给 超时,超时,超时,没有办法因为在自己看来算法和结果都是没有问题,所以在代码格式上动了点心思,结果时间虽然有所减少但是超时了。
这是原题描述
51Nod - 1081
下面附上自己最初的代码,当然我认为这是初学者都最先想到的办法。
下面附上从度娘那里学来的前缀和算法,这种算法能够有效的降低算法复杂度以及时间复杂度,在某类型问题里应该是很常用的。
那么到底什么是前缀和算法呢?
就以这道题为例,即为通过提前算好各前i项和,在后面查询时 能够大量减少计算量,避免重复计算,节省时间,不过需要注意相应的下标。
这是原题描述
51Nod - 1081
下面附上自己最初的代码,当然我认为这是初学者都最先想到的办法。
#include <stdio.h> int main() { long long sum;int a[50000],n,q,i,l; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); scanf("%d",&q); for(;q>0;q--) { sum=0; scanf("%d%d",&i,&l); i=i-1; for(;l>0;i++,l--) sum=sum+a[i]; printf("%lld\n",sum); } return 0; }
下面附上从度娘那里学来的前缀和算法,这种算法能够有效的降低算法复杂度以及时间复杂度,在某类型问题里应该是很常用的。
int main() { long long sum,b[50001]; int n,q,i,l,j; b[0]=0; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&j)// This is what fucking 前缀和算法! b[i]=j+b[i-1]; // 在输入数据时就将前i和计算出并进行存储。 } scanf("%d",&q); for(;q>0;q--) { scanf("%d%d",&i,&l); sum=b[i+l-1]-b[i-1]; printf("%lld\n",sum); } return 0; }
那么到底什么是前缀和算法呢?
就以这道题为例,即为通过提前算好各前i项和,在后面查询时 能够大量减少计算量,避免重复计算,节省时间,不过需要注意相应的下标。
相关文章推荐
- 51Nod-1081 子段求和【前缀和】
- 51nod-1081[前缀和]子段求和
- 51Nod-1081 子段求和
- 51nod 1081 子段求和
- 51Nod 1081 子段求和
- 51Nod-1081-子段求和
- 【51NOD-0】1081 子段求和
- 51nod 1081 子段求和
- 51nod_1081 子段求和
- 51nod 1081 子段求和
- 51Nod-1081-子段求和
- 51nod 1081 子段求和
- 51Nod 1081 子段求和(数组/树状数组)
- 51NOD 1081 子段求和
- 51nod:1081 子段求和(树状数组)
- 51Nod 1081 子段求和
- 51nod 1081 子段求和(树状数组)
- 【51Nod】1081 子段求和
- 1081 子段求和(前缀和)
- 51Nod 1081前缀和