总结(18.6.1)

Posted jrzztd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了总结(18.6.1)相关的知识,希望对你有一定的参考价值。

今天学习了线段树,初次学习,线段树适用于解决和树状数组一样

类型的题目,树状数组利用的是前缀和,而线段树利用的直接是

区间,树状数组用二进制下标来做,线段树则利用递归来写,

线段树的模板函数:

 1 void build(int p,int l,int r)
 2 {
 3     t[p].l=l,t[p].r=r;
 4     if(l==r)
 5     {
 6         t[p].dis=a[l];
 7         return;
 8     }
 9     int mid=(l+r)/2;
10     build(p*2,l,mid);
11     build(p*2+1,mid+1,r);
12     t[p].dis=t[p].dis+t[p*2].dis+t[p*2+1].dis;
13 }
14 void change(int p,int x,int y)
15 {
16     if(t[p].l==t[p].r)
17     {
18         t[p].dis+=y;
19         return;
20     }
21     int mid=(t[p].l+t[p].r)/2;
22     if(x<=mid)
23     change(p*2,x,y);
24     else
25     change(p*2+1,x,y);
26     t[p].dis=t[p*2].dis+t[p*2+1].dis;
27 }
28 int print(int p,int l,int r)
29 {
30     if(l<=t[p].l&&r>=t[p].r)
31     return t[p].dis;
32     int mid=(t[p].l+t[p].r)/2;
33     int ans=0;
34     if(l<=mid)
35     ans+=print(p*2,l,r);
36     if(r>mid)
37     ans+=print(p*2+1,l,r);
38     return ans;
39 }

大概概括就先建树,然后单点更新(先找到更新的点,再往上加),最后区间查询。(具体内容参考其他大佬博客)。

今天初学线段树,理解了一下,模板题我现在是能写的,其他题以后再学再思考吧。

以上是关于总结(18.6.1)的主要内容,如果未能解决你的问题,请参考以下文章

BootStrap有用代码片段(持续总结)

BootStrap实用代码片段(持续总结)

回归 | js实用代码片段的封装与总结(持续更新中...)

查看发票组代码后的总结和有感

VsCode 代码片段-提升研发效率

Python学习总结