#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int sum[1000000];
int main()
{
int n,m,t,i,a,b;
memset(sum,0,sizeof(sum));
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
scanf("%d",&t);
sum[i]=sum[i-1]+t;
}
while(m--){
scanf("%d%d",&a,&b);
printf("%d\n",sum[b]-sum[a-1]);
}
return 0;
}
总结:这个比较有意思。开始看题目数据比较大,而且说有多次询问,就想着先得做好表,但是依然超时,但想想又没有更好的方法,检查又没错,就看了看讨论区,说不能用cin,cout ,所以就把所有的cin换成scanf() ,但是依然超时。。。。。 后来一看cout还没换,就又把cout换成printf() ,后来就过了 ^_^ (用时 176)(输入输出主要是while循环里面的),再后来把while循环里面的输入输出用scanf(), printf() ,外面的用cin,cout 依然通过,但是用时 376 。
用树状数组做的(树状数组的作用):
//数据结构 之 树状数组
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int c[1000005];
int n;
int lowbit(int k)
{
return k&(-k);
//return k&(k^(k–1));
}
void add(int i,int x)
{
while(i<=n){
c[i]+=x;
i+=lowbit(i);
}
}
int query(int num)
{
int sum=0;
while(num>0){
sum+=c[num];
num-=lowbit(num);
}
return sum;
}
int main()
{
int m,t,a,b,i;
//string s;
//char s[10];
memset(c,0,sizeof(c));
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
scanf("%d",&t);
add(i,t);
}
while(m--){
//cin>>s;
scanf("%d%d",&a,&b);
printf("%d\n",query(b)-query(a-1));
}
return 0;
}