学习日记14

本文详细介绍了树状数组的基本概念及应用场景,包括单点更新、区间求和等操作,并对比了其与累加数组的优劣。同时,文章还探讨了如何通过树状数组解决顺序对数等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     今天中午,学习了树状数组,从 我看的这些知识点,题目来说,树状数组是用来求数列的和,顺序,逆序,数列中数据的删除和添加。数列的和包括全部的和,还有一段和,这些都可以用树状数组实现,其实累加数组也可以实现,但是累加数组在实现数据添加,删除时就不行了,由于树状数组本身存储就是一段一段的,所以当修改数据时还是比较快的,至少比累加和的数组快,当求逆序时,数组里存一,表示有一个数,每次更新数组时,都要进行检验,是否是顺序,就是用树状数组中最大的位置减去刚更新的位置,如果刚更新的位置的数字是顺序的话,它的值应该和最大的位置的数是一样,因为目前在这个树状数组中,刚更新的位置,就是最大的,否则,则不一样大。当,求顺序的对数时,只需要累加,更新的树状数组即可,因为,它记录的数字,是在它前面数字的数量多少,也是增加了它之后,顺序对数增加的数量,依次累加,就会得到总共的顺序对数。

    一般,树状数组有----单点更新,区间求和。----区间更新,单点求值。---区间更新,区间求和。三部分,其中第三点可以用线段树做,第三点也是第一点和第二点的综合应用。第一点时最基本的操作,就是用更新函数,更新一个点,更新完之后,在它之后的整个树状数组也都更新完了,然后直接求和就可以了。第二点,更新区间可以转换为更新两个点,若要把区间  i   到  j   的值都增加1。可以把树状数组的  i  位置增加1,在树状数组的  j  的下一个位置减去1,这样在区间 i  到  j上就增加了一,但这个数组已经不代表原来的意义了,因为很多地方已经不符合它的规则了,已经失效了。第三点,是由前面两部分组成,所求和如果都是从一开始,区间更新,用第二点更新了,但是还要用一个数组保存区间增加的数值,那要求区间和的时候,和就包含两部分,一部分是原来序列的和,第二部分是增加的那一部分的和,当然第二部分和需要两个树状数组来求,因为用第二点区间更新,是求不出区间和的,需要(增加部分)乘(区间包含的增加了得数据的数量),要求这部分就需要两个树状数组。

     求这一部分的过程,总和=原来数组和+增加的和。(假设从1开始到x求和)。

     如果用c[ k ]来代表k增加的那部分,那么增加的和c[ 1 ]*(x)+c[ 2 ]*(x-1)+c[ 3 ]*(x-2)+.........c[ k ]*(x-k+1);

     增加的和=c[ k]*(x+1)-c[k]*k;

     这个和就可以用两个树状数组分别保存c[ k]的值和c[k]*k的值。

     如果原来的数组和用b数组求累加和得到,那么最后的sum[x]=b[x]+c[ k]*(x+1)-c[k]*k;(这是1到x的和);

     以上内容都是学习自其他人的博客和题解。

    看完了树状数组的知识点并读懂老师说的题后,还做了一道题,感觉还可以。下午的比赛,当时看了第一题,感觉是bfs()会做,但是写出来就是不对,这个很尴尬。e这个题,也是一看就是最大生成树,打出代码,就是过不了,看来练得还是少啊,最后发现代码确实有问题,前几个还有最短路径的题,因为最短路径用佛洛依德做的多,所以看了时间限制,没敢写,得把和prim算法差不多的最短路径好好练一练,这样练熟了一种题,两类题都可以用了。

    做题做的脑子疼,好好休息休息。qaq、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值