NOIP基础算法与经典问题01 一维前缀和

一维前缀和维护是一种基础的小算法,该算法用我们所熟知的数列求和方式优化我们的某些查询操作,是一种动态规划的思想。

这里为介绍一维前缀和维护问题,我们来思考这个最简单的问题:

问题描述:
已知n个数的数列a,有m次询问,每次询问给定l,r两个数,求 al到 ar 内所有数的和。注意l到r的区间包含 al 和 ar 两个数。
输入数据:
第一行n和m,接下来一行有n个数,表示数列a,接下来有m行,每行有两个数l,r,详细解释参考问题描述。
输出数据:
m行,每行一个求和解。
输入样例:
5 2
1 2 3 4 5
2 4
3 5
输出样例:
9
12
数据范围:
0

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

const int MAXN=1000010;

int n,m,a[MAXN];

//读入优化 
int read(){
    char ch=getchar();
    bool fl=0;
    int r=0;
    if(ch=='-'){
        fl=1;
        ch=getchar();
    } 
    while(ch>='0'&&ch<='9'){
        r*=10;
        r+=ch-'0';
        ch=getchar();
    }
    return fl?-r:r; 
}

//输出优化 
void write(int x){
    if(x<0){
        putchar('-');
        x=-x;
    }
    if(x>9){
        write(x/10);
    }
    putchar(x%10+'0');
}

int main(){
    freopen("in.txt","r",stdin);
    freopen("std.txt","w",stdout);
    n=read();
    m=read();
    a[0]=read();
    for(int i=1;i1];//前n项和求法,O(n)复杂度 
    }
    for(int i=0;iint l,r;
        l=read();
        r=read();
        if(l==1){
            write(a[r-1]);//输出结果,单次O(1),总共O(m) 
        }else{
            write(a[r-1]-a[l-2]);//隐含的数组下标越界问题,在我写二维前缀和的时候发现的 
        }
        putchar('\n');
    }
    return 0;
} 

你可能感兴趣的:(算法教学)