题目描述:
ZZH觉得自己是小高一第一人,所以他决定来考考你。
给你正整数n,m,然后给你一个长为n的数列a, m代表m次操作,接下来m行每行给你个l和r,区间和就是从l到r所有a[i](l <= i <= r)的和,然后输出m次询问中的区间和的最大值。
输入格式:
第一行两个整数n,m
第二行为n个数,第i个代表ai
接下来m行每行两个整数l和r
输出格式:
输出一个整数,代表m次询问中的最大值。
样例输入:
10 3 1 2 3 4 5 6 7 8 9 10 1 6 5 9 2 7
样例输出:
35
提示:
对于70%的数据: n <= 3000 , m <= 3000
对于100%的数据: n , m <= 10 ^ 6
abs(a[i]) <= 10 ^ 8
数据太多,读入用scanf("%d", &a[i]);
时间限制: 1500ms
空间限制: 256MB
依然需要优化,前缀和板子题(可惜当时没有做出来)
代码实现:
#include<bits/stdc++.h>
using namespace std;
long long a[1000001],x,y,n,m,maxn,ans;
int main(){
scanf("%lld %lld",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&x);
a[i]=a[i-1]+x;
}
for(int i=1;i<=m;i++){
scanf("%lld %lld",&x,&y);
ans=a[y]-a[x-1];
if(ans>maxn)maxn=ans;
}
cout<<maxn;
return 0;
}
实在不理解就上洛谷找解释吧(我懒得解释了)