• 树状数组


    #include<iostream>
    using namespace std;
    int n,m,i,num[100001],t[200001],l,r;//num:原数组;t:树状数组 
    int lowbit(int x) 
    {
        return x&(-x); //右起第一个1的位置为第k个 返回值则为2^(k-1)
    }
    void update(int x,int p)//更新第x 的值
    {
        while(x<=n)
        {
            t[x]+=p;
            x+=lowbit(x);//不断找到自己的祖先 更新值
        }
        return;
    }
    int sum(int k)//前k个数的和 
    {
        int ans=0;
        while(k>0)
        {
            ans+=t[k];
            k-=lowbit(k);
        }
        return ans;
    }
    int ask(int l,int r)//求l-r区间和 
    {
        return sum(r)-sum(l-1); 
    }
    int main()
    {
        cin>>n>>m;
        for(i=1;i<=n;i++)
        {
            cin>>num[i];
            update(i,num[i]);
        }
        for(i=1;i<=m;i++)
        {
            cin>>l>>r;
            cout<<ask(l,r)<<endl;
        }
        return 0;
    }
  • 相关阅读:
    20161115学习笔记
    20161114学习笔记
    微服务
    20161111学习笔记
    20161110学习笔记
    统一ID生成服务
    BlockingQueue原理
    spring常用注解
    Spring 事件发布
    java8 DateUtil工具
  • 原文地址:https://www.cnblogs.com/Aragaki/p/7226766.html
Copyright © 2020-2023  润新知