真正的最完整题解
2025-05-12 20:50:13
发布于:浙江
9阅读
0回复
0点赞
不得不说,ACGO数据水了。
拿到题,废话不多说,直接暴力!
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int a[1000005];
signed main() {
    cin>>n>>m;
    for(int i = 1;i<=n;i++){
		cin>>a[i];
	}
    while(m--){
        int l,r;
        cin>>l>>r;
        int ans = 0;
        for(int j = l;j<=r;j++){
            ans+=a[j];
        }
        cout<<ans<<'\n';
    }
    return 0;
}
这肯定是不……不儿,啦?

当然,按常理来说,的数据的时间复杂度一定会的。
所以,换思路!
首先,我们先来进食一下“前缀和”的知识点。
第一步,准备一个sum数组,就像这样:int sum[1000005];。
第二步,预处理sum数组,sum[i]就表示a[1]到a[n]这个区间的和。代码:sum[i]=sum[i-1]+a[i];
接下来怎么计算呢?
请看图片:

借助这个思路,成功!
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int a[1000005];
int sum[1000005];
signed main() {
    cin>>n>>m;
    for(int i = 1;i<=n;i++){
		cin>>a[i];
		sum[i]=sum[i-1]+a[i];
	}
	while(m--){
		int l,r;
		cin>>l>>r;
		cout<<sum[r]-sum[l-1];
	}
    return 0;
}
全部评论 5
ddd
2025-05-12 来自 浙江
0ddd
2025-05-12 来自 浙江
0ddd
2025-05-12 来自 浙江
0ddd
2025-05-12 来自 浙江
0ddd
2025-05-12 来自 浙江
0



有帮助,赞一个