区间sum 和为k的连续区间-前缀和

区间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;
}
原文地址:https://www.cnblogs.com/yzm10/p/7191321.html