zoukankan      html  css  js  c++  java
  • 士兵杀敌(二)

    题目

    解决:(树状数组)本题是树状数组的基本应用符合两个特征,1、求区间和 2、修改的是单个元素

     
    #include <iostream> 
    #include <cstdio>
    using namespace std;
    const int N=1000005;
    int c[N];
    int n;
    //该函数功能是求出n二进制中最右边0的个数的2次幂,也等于c[n]包含的元素个数num[n-lowbit(n)+1]+...+num[n]
    int lowbit(int n)
    {
        return n&(-n);
    }
    //更新数组中pos的值使它加上inc,更新首先更新c[pos]一直更新该点的父节点到顶端
    void pl(int pos,int inc)
    {
        while(pos<=n)
        {
            c[pos]+=inc;
            pos+=lowbit(pos);
        }
    }
    //该函数功能是求的前n项元素的和
    int getsum(int n)
    {
        int sum=0;
        while(n>0)
        {
            sum+=c[n];
            n-=lowbit(n);
        }
        return sum;
    }
    
    int main()
    {
        int m,i;
        char cmd[7];
        scanf("%d%d",&n,&m);
        int num;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&num);
            pl(i,num);
        }
        int a,b;
        while(m--)
        {
            getchar();
            scanf("%s%d%d",cmd,&a,&b);
            if(cmd[0]=='Q')printf("%d\n",getsum(b)-getsum(a-1));
            else pl(a,b);
        }
       // system("pause");
        return 0;
    }
           
            
            
    

  • 相关阅读:
    CentOS7- 配置阿里镜像源
    MySQL学习笔记
    OSI&TCP/IP模型
    加密算法学习
    golang学习笔记
    Redis学习总结整理
    TCP
    HTTP/HTTPS
    HTTP2
    MVCC
  • 原文地址:https://www.cnblogs.com/hpustudent/p/2129467.html
Copyright © 2011-2022 走看看