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

     1 #include <cstdio>
     2 #include <cstring>
     3 using namespace std;
     4 
     5 int a[1000010],c[1000010];
     6 int N,M;
     7 
     8 int lowbit(int x)       
     9 {
    10     return x&(-x);      
    11 }
    12 
    13 int sum(int i)          //BIT的求和 , 计算前i项的和,需要从i开始,不断把当前位置i的值加到结果中,并把i中减去i的二进制最低位非0为对应的幂,直到i变成0为止。
    14 {
    15     int s=0;
    16     while(i>0)
    17     {
    18         s+=c[i];
    19         i-=lowbit(i);       //x&-x即  x&(x-1) 求最低位为1的数。
    20     }
    21     return s;
    22 }
    23 
    24 void change (int x,int m)           //BIT的值更新,使第i(x)项的值增加x需要从i(x)开始,不断把当前位置i的值增加x,并把i的二进制最低位非0为对应的幂加到i上
    25 {
    26     int i;
    27     for(i=x;i<=N;i+=lowbit(i))
    28         c[i]+=m;
    29 }
    30 
    31 int main()
    32 {
    33     char s[20];
    34     memset(s,0,sizeof(s));
    35     scanf("%d%d",&N,&M);
    36     for(int i=1;i<=N;i++)
    37     {
    38         scanf("%d",a+i);
    39         change(i,a[i]);
    40     }
    41     int m,n;
    42     while(M--)
    43     {
    44         scanf("%s%d%d",s,&m,&n);
    45         if(s[0]=='Q')
    46             printf("%d
    ",sum(n)-sum(m-1));
    47         else
    48             change(m,n);
    49     }
    50     return 0;
    51 }
    52     
    View Code

    刚开始用写了一个子函数,即当加入时,把i的后面全加上x,不用想了,肯定超时。

    最后上网上找了下题解,看到用树状数组。so 直奔挑战程序看了关于相关知识,了解到把 BIT(树状数组)的求和子函数和BIT的值更新子函数写好。就ok了;

  • 相关阅读:
    大数据量时(上千万),分页查询该怎么优化
    Nginx常见面试问题
    Tomcat常用的调优手段
    jenkens
    docker环境搭建httprunner接口自动化
    TypeError: string indices must be integers
    接口自动化简单框架
    phpStudy使用手册
    搭建测试环境
    【Linux】测试环境如何搭建?
  • 原文地址:https://www.cnblogs.com/WDKER/p/5409870.html
Copyright © 2011-2022 走看看