士兵杀敌(一)(树状数组)
士兵杀敌(一)
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
-
南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的。
小工是南将军手下的军师,南将军现在想知道第m号到第n号士兵的总杀敌数,请你帮助小工来回答南将军吧。
注意,南将军可能会问很多次问题。
- 输入
- 只有一组测试数据 第一行是两个整数N,M,其中N表示士兵的个数(1<N<1000000),M表示南将军询问的次数(1<M<100000) 随后的一行是N个整数,ai表示第i号士兵杀敌数目。(0<=ai<=100) 随后的M行每行有两个整数m,n,表示南将军想知道第m号到第n号士兵的总杀敌数(1<=m,n<=N)。
- 输出
- 对于每一个询问,输出总杀敌数 每个输出占一行
- 样例输入
-
5 2 1 2 3 4 5 1 3 2 4
- 样例输出
-
6 9
题解:树状数组:
代码:1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<algorithm> 5 using namespace std; 6 #define MAX(x,y)(x>y?x:y) 7 #define MIN(x,y)(x<y?x:y) 8 //#define LOCAL 9 const int INF=0x3f3f3f3f; 10 const int MAXN=1000010; 11 int tree[MAXN]; 12 int N; 13 int lowbit(int x){ 14 return x&(-x); 15 } 16 void update(int x,int y){ 17 while(x<=N){ 18 tree[x]+=y; 19 x+=lowbit(x); 20 } 21 } 22 int query(int x){ 23 int ans=0; 24 while(x){ 25 ans+=tree[x]; 26 x-=lowbit(x); 27 } 28 return ans; 29 } 30 int main(){ 31 #ifdef LOCAL 32 freopen(data.in,"r",stdin); 33 freopen(data.out,"w",stdout); 34 #endif 35 int M; 36 scanf("%d%d",&N,&M); 37 int a,b; 38 for(int i=1;i<=N;i++){ 39 scanf("%d",&a); 40 update(i,a); 41 } 42 while(M--){ 43 scanf("%d%d",&a,&b); 44 printf("%d\n",query(b)-query(a-1)); 45 } 46 return 0; 47 }