题目描述
“A+B”多么熟悉的题目,在本届校赛开始前CHZ同学(人称“dp小王子“)一直叫我出道A+B给他做,但由于各种原因没有出成,使他感到很遗憾,为了在世界末日前弥补他的遗憾,就决定出道A+B献给CHZ同学!!题目是这样的:
先给你n(1=<n<=100000)个数的数组A,再给你两个数X,Y(1=<X,Y<n),求sum=(A0+A1+….+Ax-1)+(Ay+Ay+1+….+An-1);
输入
有多组数据,每组数据的第一行有两个数字n,m(1=<m<=100000),表示数据的个数和查询的个数,第二行是n个数据,第三行到m+3行每行有两个数X,Y(1=<X,Y<n);
输出
对每个查询输出一个结果,每个结果占一行
样例输入
10 1
1 2 3 4 5 5 4 3 2 1
5 5
样例输出
30
提示
来源
【想法】
关于读题:
不知道会不会像我一样产生歧义,但的确就是一个字符串进行m次的sum求解,并输出
根据题目可得:
sum=(A0+A1+….+Ax-1)+(Ay+Ay+1+….+An-1);
也就可以当做数组A的整个累计求和减去(Ax+……+Ay-1)的和
简单却又比较浪费的方法就是在输入时同时进行累计求和
s[i]=s[i-1]+a[i];
由于不用库函数,导致两个(c&c++)没有太大区别
#include<iostream>//用c++
using namespace std;
const int N = 100010;
int main()
{
int a[N],s[N];
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>a[i];
s[i]=s[i-1]+a[i];
}
while(m--)
{
int x,y,sum=0;
cin>>x>>y;
sum+=s[x-1]+s[n-1]-s[y-1];
cout<<sum<<endl;
}
}
#include<stdio.h>
//用c
const int N = 100010;
int main()
{
int a[N],s[N];
int n,m,sum=0;
int x,y;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
s[i]=s[i-1]+a[i];
}
while(m--)
{
sum=0;
scanf("%d %d",&x,&y);
sum+=s[x-1]+s[n-1]-s[y-1];
printf("%d\n",sum);
}
}