区间sum
有一个长度为n的正整数序列a1--an,candy想知道任意区间[L,R]的和,你能告诉他吗?
第一行一个正整数n(0<n<=1e6),
第二行为长度为n的正整数序列 a1到an(ai<=1e9,sum(a)<=1e18),
第三行一个正整数m(m<=1e6),表示询问次数,
随后m行,每行两个正整数L,R(1<=L<=R<=n)。
m行输出,对应m次询问结果
复制
5 1 4 3 6 3 3 1 3 2 2 1 5
8 4 17
一整数数列a1, a2, ... , an(有正有负),以及另一个整数k,求一个区间i,ji,j,(1 <= i <= j <= n),使得aii + ... + ajj = k。
Input第1行:2个数N,K。N为数列的长度。K为需要求的和。(2 <= N <= 10000,-10^9 <= K <= 10^9)
第2 - N + 1行:Aii(-10^9 <= Aii <= 10^9)。Output如果没有这样的序列输出No Solution。
输出2个数i, j,分别是区间的起始和结束位置。如果存在多个,输出i最小的。如果i相等,输出j最小的。Sample Input
6 10 1 2 3 4 5 6
Sample Output
1 4
前缀和,通常用来求某个区间的和或和为多少的区间,前者时间复杂度由暴力O(n)节省到了O(1),是一个高效的区间和方法。
#include<stdio.h> int main() { int n,m,l,r,i; long long a[1000005]; scanf("%d",&n); a[0]=0; scanf("%lld",&a[1]); for(i=2;i<=n;i++){ scanf("%lld",&a[i]); a[i]+=a[i-1]; } scanf("%d",&m); for(i=1;i<=m;i++){ scanf("%d%d",&l,&r); printf("%lld ",a[r]-a[l-1]); } return 0; }
#include<stdio.h> #include<string.h> int main() { long long n,k,f,i,j; long long a[10005],b[10005]; scanf("%lld%lld",&n,&k); memset(b,0,sizeof(b)); scanf("%lld",&a[1]); b[1]=a[1]; for(i=2;i<=n;i++){ scanf("%lld",&a[i]); b[i]+=b[i-1]+a[i]; } f=0; for(i=1;i<=n;i++){ for(j=i;j<=n;j++){ if(b[j]-b[i-1]==k){ printf("%lld %lld ",i,j); f=1; break; } } if(f==1) break; } if(f==0) printf("No Solution "); return 0; }