zoukankan      html  css  js  c++  java
  • 士兵杀敌(一)(树状数组)

    士兵杀敌(一)

    时间限制: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
    ",query(b)-query(a-1));
    45     }
    46     return 0;
    47 }
  • 相关阅读:
    D3.js:交互式操作
    D3.js:Update、Enter、Exit
    D3.js:动态效果
    D3.js:完整的柱形图
    D3.js:坐标轴
    D3.js
    ES 6 : 数组的扩展
    ES 6 : Math对象的扩展
    拉勾网企业图片列表效果
    拉勾网图片切换效果
  • 原文地址:https://www.cnblogs.com/handsomecui/p/4893011.html
Copyright © 2011-2022 走看看