首页 > 其他分享 >树状数组

树状数组

时间:2025-01-20 21:22:15浏览次数:1  
标签:单点 树状 int lowbit void update 数组

l(x) = x - lowbit(x) + 1。即,l(x) 是 c[x] 管辖范围的左端点。
对于任意正整数 x,总能将 x 表示成 s*2^{k + 1} + 2^k 的形式,其中lowbit(x) = 2^k。
下面「c[x] 和 c[y] 不交」指 c[x] 的管辖范围和 c[y] 的管辖范围不相交,即 [l(x), x] 和 [l(y), y] 不相交。「c[x] 包含于 c[y]」等表述同理。
lowbit

int lowbit(int x)
{
    return x&(-x);      //最后一位1
}

一维

void update(int x,int y) //单点加
{
    for(;x<=n;x+=lowbit(x)) c[x]+=y;
}
int sum(int x)
{
    int ans=0;
    for(;x;x-=lowbit(x))
        ans+=c[x];
    return ans;
}

二维

void update(int x,int y,int z) //单点加
{
    for(;x<=n;x+=lowbit(x))
        for(;y<=n;y+=lowbit(y))
            c[x][y]+=z;
}
int sum(int x,int y)
{
    int ans=0;
    for(;x;x-=lowbit(x))
        for(;y;y-=lowbit(y))
             ans+=c[x][y];
    return ans;
}

标签:单点,树状,int,lowbit,void,update,数组
From: https://www.cnblogs.com/-include-lmt/p/18682537

相关文章

  • 剑指offer面试题3:数组中重复的数字(Python实现)
    """面试题3:数组中重复的数字在一个长度为n的数组里所有数字都在0~n-1的范围内,某些数字是重复的,找出任意一个重复的数字"""defduplicate1(numbers:list,length:int)->int:"""修改原数组"""ifnumbers==[]orlength<=0:......
  • java —— 数组(超详细教程)
    介绍:这期讲的是java的原生数组,也就是list(静态空间),空间是写死的;后期的ArrayList是动态数组。我们需要先认识基础的格式,方便后面的ArrayList学习。一、创建数组(一)方法一:1、先声明,再定义长度。publicstaticvoidmain(String[]args){//声明变量int[......
  • C语言逆序操作数组和引用传递参数
    ////main.c//Test_C////Createdbystevexiaohuzhaoon2025/1/20.//#include<stdio.h>//C语言指针传递参数(引用传递)voidswap(int*px,int*py){intt=*px;*px=*py;*py=t;}voidtest(intn){intx=1;for(inti......
  • leetcode349-两个数组的交集
    leetcode349实现利用哈希set进行去重,然后循环nums2,如果nums2中的元素是在去重后的num1中出现过的,就存放在set2中,因为最后要返回的是不重复的数组,所以先放在set2,让其进行去重,最后把set2转为数组方法1varintersection=function(nums1,nums2){constset1=[........
  • PTA 之 数组元素循环右移问题
    一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0​A1​⋯AN−1​)变换为(AN−M​⋯AN−1​A0​A1​⋯AN−M−1​)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?输入格式:......
  • 写一个方法,传入数字x,从一个一维数组里找到两个数字符合“n1 + n2 = x”
    在前端开发中,你可以使用JavaScript来编写这个方法。下面是一个简单的实现,它接受一个数字x和一个一维数组arr作为参数,并尝试在数组中找到两个数字,使它们的和等于x。如果找到了这样的两个数字,它会返回一个包含这两个数字的数组;如果没有找到,它会返回null。functionfindTwoNumbersTh......
  • 树状数组板子(单点增加+范围查询)
    用于解决范围数字和与单点增加问题(复杂度O(logn))build方法(构造树状数组)voidbuild(){ for(inti=1,v;i<=n;i++){ cin>>v; add(i,v); }}lowbit方法(获取一个二进制数最低位的1的状态)intlowbit(intx){ returnx&(-x);}add方法(单点增加)voidadd(inti,int......
  • 代码随想录——动态规划31打家劫舍III(树状DP)
    这道题目是打家劫舍III(HouseRobberIII),是打家劫舍系列问题的变种。问题描述如下:小偷发现了一个新的区域,这个区域的所有房屋排列类似于一棵二叉树。如果两个直接相连的房屋在同一晚被打劫,房屋会自动报警。给定这棵二叉树的根节点root,求在不触发警报的情况下,小偷能够盗取的最......
  • 全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之一维数组(应用技巧)
    二、一维数组应用技巧2:打标记实战训练1—开关灯问题描述:有M个从1到M依次编号的人参加一项游戏。将K盏从1到K依次编号的灯(K和M均为正整数,M≤K≤5000)进行一系列的熄灭与打开的操作,游戏开始时均处于亮灯的状态;第一个人(1号)将灯全部熄灭;第二个人(2号)将编号为2的倍数的灯做......
  • 算法随笔_12:最短无序子数组
    上一篇: 算法随笔_11:字符串的排列-CSDN博客题目描述如下:给你一个整数数组nums,你需要找出一个连续子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。请你找出符合题意的最短子数组,并输出它的长度。示例1:输入:nums=[2,6,4,8,10,9,15]输出:5解释:......