当前位置: 首页 > 编程日记 > 正文

树状数组的理解(前缀和 and 差分)

二更——

有神仙反映数星星那个题外链炸了,我决定把图给你们粘一下,汉语翻译的话在一本通提高篇的树状数组那一章里有,同时也修改了一些汉语语法的错误

这段时间学了线段树组,当神仙们都在学kmp和hash的时候,我这个蒟蒻致远星了,,,,,所以在补完字符串算法之后我决定再补一补数据结构

这篇总结主要就是给自己看的,所以树状数组的原理请移步这篇

高赫奆佬的blogs

这篇以例题为主

首先是一道板子题

P3374 【模板】树状数组 1

这个题是个板子

让我们来看一看树状数组的一些操作

1.对某一个点添加某个值

void update(int x,int y)
{while(x <= n){t[x] += y;x += lowbit(x);}
}

考虑树状数组t[ x] 表示区间[x-lowbit(x)+1,x]之间所有数的和,又因为所有x为2的整倍数的t数组的值都来自于前面2的整倍数的贡献,所以我们要把每一个lowbit(x)都进行添加x值

如果你看不懂,可以看看这个图

2.还有就是查询某个区间的值

我们肯定知道在前缀和中[x,y]这个区间的值就是sum(y)-sum(x-1)对吧,然后我们只需要写出来sum函数就可以了

int sum(int x)
{int res = 0;while(x>0){res += t[x];x -= lowbit(x);}return res;
}

还有就是快速求lowbit(x)的值的代码

int lowbit(int x)
{return x & (-x);
}

这样我们这道板子题就差不多完事了

放一下代码吧

#include <iostream>
#include <cstdio>
using namespace std;
int n, m, t[500010];
int lowbit(int x)
{return x & (-x);
}
void update(int x,int y)
{while(x <= n){t[x] += y;x += lowbit(x);}
}
int sum(int x)
{int res = 0;while(x>0){res += t[x];x -= lowbit(x);}return res;
}
int main()
{scanf("%d%d", &n, &m);for (int i = 1, v; i <= n; ++i){scanf("%d", &v);update(i,v);}for (int i = 1, temp, u, v; i <= m; ++i){scanf("%d%d%d", &temp, &u, &v);if(temp == 1)    update(u,v);else    printf("%d\n",sum(v) - sum(u - 1));}return 0;
}

下面来看到第二个板子

P3368 【模板】树状数组 2

这个题换了一个问法,问的是某几个数的差,所以我们再添加差分这个元素

把原本p[x]表示的意思变为[x-lowbiut(x)+1,x]这个区间右端点与左端点的差,因为还是按照lowbit(x)来倍增的,所以我们能够通过sum这个函数来求得任意两个数的差分值,然后相减就能得到所求数字,不明白的话,我慢慢讲来。

首先sum和update的方法是不变的,但是因为我们对于一个区间内的所有数都加z,所以这个区间内的差分值是不变的,我们只对左端点的差分值加z,右端点+1的位置的差分值-z就行了

update(l,z);
update(r + 1,-z);

想要求某一个数的话,直接将这个数到1所有的差分值相加即可求得,也就是sum(x)

这个题就完事啦

#include <iostream>
#include <cstdio>
using namespace std;    
long long n, m,t[500010];
inline int lowbit(int x)
{return x & (-x);
}  
inline void update(int x,int y)
{while(x<=n){t[x] += y;x += lowbit(x);}
}
inline int sum(int x)
{int res = 0;while(x){res += t[x];x -= lowbit(x);}return res;
}
int main()
{scanf("%d%d", &n, &m);int now,past = 0;for (int  i = 1; i <= n; ++i){scanf("%d", &now);update(i,now - past);past = now;}for (int i = 1,k; i <= m;++i){scanf("%d", &k);if(k == 1){int x, y, z;scanf("%d%d%d", &x, &y, &z);update(x,z);update(y + 1,-z);}else{int x;scanf("%d", &x);printf("%d\n", sum(x));}}return 0;
}

还有一道比较好玩的题目

ural 1028 stars

这个题的大体意思就是给你星星的坐标,在星星左下方的(包括正左和正下)的星星有k颗,那么这个星星就是k级的,问每一级星星的数量,星星的坐标按照y轴升序输入,y轴相同的按x轴升序输入

怎么说呢,一看到坐标肯定先想到二维数组,但是数据范围在这个地方了,你肯定是不能开p[15000][15000]的,我们再看看这个题,他的输入很棒啊,保证了后输入的一定是把之前输入的星星包含在内了,所以我们就可以用a[x] 表示横坐标为x的星星的个数,然后跑一遍统计一下就可以辣

上代码

这地方有个坑,就是星星的坐标可以是(0,0)但是我们跑前缀和的时候因为有lowbit(x)操作,下标必须从1开始,所以我们把每一个读进来的x都++,这样的话不仅不影响最终结果,而且也不会出锅啦

#include <stdio.h>
#include <stdlib.h>
#include <string.h>using namespace std;int c[32010];
int level[32010];//求2的K次幂
int lowbit(int t)
{return t&(-t);
}
//更新树状数组
void update(int t)
{while(t<32010){++c[t];t+=lowbit(t);}
}
//获取前N项和
int getSum(int t)
{int sum = 0;while(t>0){sum+=c[t];t-=lowbit(t);}return sum;
}
int main()
{int n;int x;int y;int i;int sum;scanf("%d",&n);memset(c,0,sizeof(c));memset(level,0,sizeof(c));for(i = 0;i<n;i++){scanf("%d%d",&x,&y);++x;//星星的左边可以从0开始,但是update函数的参数却不能是0,所有向后移一位
        update(x);sum = getSum(x);++level[sum];}for(i = 0;i<n;i++){printf("%d\n",level[i+1]);}return 0;
}

ok 完事~

转载于:https://www.cnblogs.com/this-is-M/p/11082874.html

相关文章:

【java】兴唐第十九节课(内部类)

内部类&#xff1a;在类的内部定义的类叫内部类 1、有名内部类&#xff1a; &#xff08;1&#xff09;实例化时必须先实例化外部对象&#xff0c;格式&#xff1a; 外部类.内部类 对象名 外部类对象名.new.内部类名&#xff08;&#xff09;&#xff1b; 代码实现&#xff1…

持续集成之“自动化部署”

转自&#xff1a;http://www.infoq.com/cn/news/2011/07/ci-automatic-deployment 在前文《依赖管理》中&#xff0c;我们讨论了如何在代码变得庞大&#xff0c;组件增多的情况下&#xff0c;做好外部库和内部组件依赖管理&#xff0c;从而提高构建效率。可以应用的实践包括&am…

1008: [HNOI2008]越狱(计数问题)

1008: [HNOI2008]越狱 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 11361 Solved: 4914[Submit][Status][Discuss]Description 监狱有连续编号为1...N的N个房间&#xff0c;每个房间关押一个犯人&#xff0c;有M种宗教&#xff0c;每个犯人可能信仰其中一种。如果相邻房间…

他山之石:Github的使用

一.awesome 关键字 搜索和关键字匹配的优秀项目 awesome springboot 搜索优秀的springboot相关的项目&#xff0c;包括框架、教程等 二.通过in关键词限制搜索范围 xxx in:name 项目名包含xxx的 xxx in:description 项目描述包含xxx的 xxx in:readme 项目的readme文件中包含x…

【java】兴唐第二十节课(Collection 和 ArrayList)

(一)Collection 1、如果实现 --able 名称的接口则证明该类或其子类有该功能 &#xff08;1&#xff09;实现Iterable接口代表具有迭代功能 &#xff08;2&#xff09;实现Cloneable接口代表具有克隆功能 &#xff08;3&#xff09;实现Serializable接口代表具有序列化的功能 …

服务器系统架构分析

我目前的nginx配置是拆散的&#xff0c;这样可以便于在很多个虚拟主机和目录里重用部分配置。 总体是划分为这样一个结构&#xff1a; conf/conf/nginx.confconf/proxy.confconf/rewrite.confconf/location.confconf/port.confconf/upstream.confconf/servers/conf/servers/www…

SharePoint SiteCollection 和SubWeb之间的迁移

因为各种不同的原因&#xff0c;项目里可能碰到需要将一个Site Collection迁移为一个子站点的情况。 实现这种需求只能用 内容部署功能中的导出和导入〉 SiteCollectoin to sub web 示例&#xff1a; cd C:\Program Files\Common Files\Microsoft Shared\web server extensions…

20154312曾林 - Exp1 PC平台逆向破解

1.逆向及Bof基础实践说明 1.1-实践目标 对象&#xff1a;pwn1&#xff08;linux可执行文件&#xff09;目标&#xff1a;使程序执行另一个代码片段&#xff1a;getshell内容&#xff1a; 手工修改可执行文件&#xff0c;改变程序执行流程&#xff0c;直接跳转到getShell函数。利…

web App libraries跟referenced libraries的一些问题

该博文内容经参看网上其他资料归纳所成&#xff0c;并注明出处&#xff1a; 问题一&#xff1a;myeclipse中Web App Libraries无法自动识别lib下的jar包&#xff08;http://blog.csdn.net/tiancai1202000/article/details/49178721&#xff09; myeclipse&#xff0c;lib中的ja…

无法在数据库 'ycmis2' 中运行 BEGIN TRANSACTION,因为该数据库处于回避恢复模式。...

alter database ycmis2 set EMERGENCY alter database ycmis2 set online 转载于:https://www.cnblogs.com/qanholas/archive/2011/08/03/2126347.html

exchange2003备份与恢复

exchange2003备份与恢复owa 访问的是在线访问方式。连接到服务器里的访问邮箱&#xff0c;操作邮件是在服务器上.先发一邮件永久删除&#xff0c;直接从服务器里把此邮件删除掉。删除之后。服务器里已没有此邮件。下面就是来恢复邮件临时位置随便写一个存在的路径。恢复之后装载…

入门Promise的正确姿势

Promise是异步编程的一种解决方案&#xff0c;从语法上说&#xff0c;Promise是一个对象&#xff0c;从它可以获取异步操作的消息。 Promise的基本用法 Promise构造函数接受一个函数作为参数&#xff0c;该函数的两个参数分别是resolve和reject。它们是两个函数&#xff0c;由J…

雪花算法 Java 版

雪花算法根据时间戳生成有序的 64 bit 的 Long 类型的唯一 ID 各 bit 含义&#xff1a; 1 bit: 符号位&#xff0c;0 是正数 1 是负数&#xff0c; ID 为正数&#xff0c;所以恒取 041 bit: 时间差&#xff0c;我们可以选择一个参考点&#xff0c;用它来计算与当前时间的时间差…

【matlab】第二次上机课

1、采用complex建立一个复数数组和直接创立一个复数数组&#xff0c;并计算它们的幅度。 代码实现&#xff1a; a complex(1,2);b 1 3i;length1 abs(a)lengthe abs(b)重点&#xff1a; 使用comlex创建复数 用abs求幅度&#xff08;模长&#xff09; 2、将A[0.8147, 0…

运行代码功能尝试

首先定义个文本域并且给个ID <textarea id"O_txt_1" rows"8" cols"80"> <!--要运行的代码--> </textarea> 然后定义个按钮 <input type"button" value"运行代码" οnclick"runCode(O_txt_1)&qu…

删除当前及子文件夹中的空目录

在对文件进行操作的工程中不免会出现空目录的情况&#xff0c;你想怎么去删除那些空目录一个一个去找&#xff0c;然后删除&#xff1f;不会吧&#xff0c;这也太累了&#xff0c;用批处理吧&#xff0c;帮你提高工作效率的&#xff0c;它会准确的判断然后进行删除。 echo off …

基于WebSocket实现聊天室(Node)

基于WebSocket实现聊天室(Node) WebSocket是基于TCP的长连接通信协议&#xff0c;服务端可以主动向前端传递数据&#xff0c;相比比AJAX轮询服务器&#xff0c;WebSocket采用监听的方式&#xff0c;减轻了服务器压力 本文作为学习websocket的练习&#xff0c;实现在线聊天的功能…

Ruby 之 Block, Proc, Lambda 联系--区别,转载

Ruby 之 Block, Proc, Lambda Block Block 不是对象&#xff0c;是Ruby的语言特性&#xff0c;近似于闭包&#xff08;Closure&#xff09;。 范例&#xff1a; def meth res yield "Block called returns #{res}"endputs meth do next “next_value” end #…

【java】牛客网刷题

1、 给出以下代码 public class TestObj{public static void main(String[] args){Object onew Object(){public boolean equals(Object obj){return true;}};System.out.println(o.equals(“Fred”));}}答案&#xff1a; true 总结&#xff1a; 知识点&#xff1a; &…

Winder摆杆不稳除了PID还可能的原因

1.卷径计算有问题。 2.速度限制住了。 转载于:https://www.cnblogs.com/Lion-Ming/p/11104972.html

javascript断点调试方法

http://www.blogguy.cn/show-728-1.html

Python爬虫案例-获取最新的中国行政区域划分

源网页&#xff1a;中国统计局标准 http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2016/ 打开网页后可以分析出行政区域划分共分为5层 根据传入参数&#xff0c;生成网页地址时需要1-3层的只传本身以及 4层及以后的增加当前省份的前缀。 #生成实际需要解析的页面地址 def …

管理分布式session的四种方式。

应用服务器的高可用架构设计最为理想的是服务无状态&#xff0c;但实际上业务总会有状态的&#xff0c;以session记录用户信息的例子来讲&#xff0c;未登入时&#xff0c;服务器没有记入用户信息的session访问网站都是以游客方式访问的&#xff0c;账号密码登入网站后服务器必…

【matlab】第三章数组和数组的运算

&#xff08;一&#xff09;操作练习 1、构建等差数列的方法 代码实现 //方法1A 5:1:10//输出结果A 5 6 7 8 9 10//方法2 A linspace(1,10,3) //输出结果 A 1.0000 5.5000 10.0000 //注意最后的3指的是一共三个元素//等比数列A logspace(0,2,5)//输…

用PHP生成等比图像的方法

PHP代码 <?php /************************************************************************ * 函数名称&#xff1a;createSmallImg() * 函数说明&#xff1a;创建等比例图片 * 输入参数&#xff1a;$dir 保存路径$source_img 原图片名称$small_ex 缩率图文件名后缀$maxw…

ARM7启动代码

1:PRESERVE8: Reguire8和Preserve8 C和汇编有8位对齐的要求&#xff0c;这两个伪指令可以满足此要求&#xff0c;存在REQUIRE8<——> PRESERVE8的对应关系&#xff0c;但不是说有一个REQUIRE8就要有一个 PRESERVE8&#xff0c;如果是一个c文件和一个汇编文件的调用&#…

一次完整请求的日志

一次完整请求的日志&#xff1a;各种配置文件&#xff1a;spring-mvc.xml<?xml version"1.0" encoding"UTF-8"?><beans xmlns"http://www.springframework.org/schema/beans" rel"nofollow"" target"_blank"…

Aveva Marine C# 二次开发入门001

1# 引用 C:\AVEVA\Marine\OH12.1.SP4\Aveva.ApplicationFramework.dll C:\AVEVA\Marine\OH12.1.SP4\Aveva.ApplicationFramework.Presentation.dll 2# 引用命名空间&#xff0c; using Aveva.ApplicationFramework.Presentation;using Aveva.ApplicationFramework; 3# 继承接口…

搜集《ASP.NET中常用的26个优化性能方法》

1. 数据库访问性能优化    a.数据库的连接和关闭    访问数据库资源需要创建连接、打开连接和关闭连接几个操作。这些过程需要多次与数据库交换信息以通过身份验证&#xff0c;比较耗费服务器资源。ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响…