关于部分和问题

有些问题思路非常简单,但由于数据量过大等问题按照题目思路线性求解则会超时,关于这一类线性求和问题,有时应考虑部分和,即数组记录的不是数据而是某种状态。

例如:在一个长度为N的数字序列A,有Q组询问,每组询问给定l和r:l≤r,请求出A[l]+A[l+1]+…+A[r]的值。由于这个结果可能很大,最终的结果要对10007取模(即取余数)(时间限制: 1500 ms 内存限制: 65536 kb)
输入:
多组数据输入,数据组数不超过10。
第一行是一个数字N,Q,表示序列A中元素的个数和询问组数。(0<N,Q≤1e6)
第二行是N个整数,第i个整数A[i]表示序列A中的第i个元素,保证均为非负整数,且在INT范围内。
接下来Q行,每行是两个用空格分隔的整数l和r(保证l和r不会超出序列A下标的范围,且l≤r)。
注意序列A的下标从1开始。
输出:
对于每组数据,每个询问输出一行,为和值。

此题如果按照输入->求和->输出的思路必然会超时(多组数据输入且在百万级别)
这时应考虑优化,即数组A[n]每项记录的是前n项和,部分和A[l]+A[l+1]+…+A[r]即计算A[r]-A[l-1]即可
C代码如下:

#include<stdio.h>
const int mod=10007;
int a[1000007];
int main(){
	int N,Q,i,l,r;
	while(scanf("%d%d",&N,&Q)==2){
		for(i=1;i<=N;i++){
			scanf("%d",&a[i]);
			a[i]=(a[i]+a[i-1])%mod;
		}
		while(Q--){
			scanf("%d%d",&l,&r);
			printf("%d\n",(a[r]-a[l-1]+mod)%mod);
		}
	}
} 

注意:每个a[i]是模后的结果,故可能a[r]小于a[l-1],为使最终结果为正数需加mod(mod%mod==0)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值