树状数组的原理和实现
树状数组的原理和实现
概念
C1 = A1
C2 = A1+A2
C3 = A3
C4 = A1+A2+A3+A4
C5 = A5
C6 = A5+A6
C7 = A7
C8 = A1+A2+A3+A4+A5+A6+A7+A8
原理
lowbit
def LOWBIT(x):
return x & (-x)
单点修改
def MODIFY(x, delta):
if x < 1:
return
while x <= n:
fenwick[x] += delta
x += LOWBIT(x)
查询
def QUERY(x):
result = 0
while right > 0:
result += fenwick[x]
x -= LOWBIT(x)
return result
练习
#include<stdio.h>
#include<string.h>
int c[32000+10];
int a[15000+10];
int lowbit(int x)
{
return x&(-x);
}
void updata(int x,int d)
{
while(x<=32001)
{
c[x]=c[x]+d;
x=x+lowbit(x);
}
}
int getsum(int x)
{
int res = 0;
while(x>0)
{
res=res+c[x];
x=x-lowbit(x);
}
return res;
}
int main()
{
int n;
int i,x,y;
while(scanf("%d",&n)!=EOF)
{
memset(c,0,sizeof(c));
memset(a,0,sizeof(a));
for(i=0; i<n; i++)
{
//因为y是升序,所以横坐标小于x的,(想了很久)所有点都符合,这是解这道题的关键。
scanf("%d%d",&x,&y); //下标可能从0开始,所以要x+1
a[getsum(x+1)]++; //求出横坐标小于x的所有stars个数,并记录到a中
updata(x+1,1); //更新区间
}
for(i=0; i<n; i++)
{
printf("%d\n",a[i]);
}
}
return 0;
}
优缺点

关注公众号:数据结构与算法那些事儿,每天一篇数据结构与算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!