码迷,mamicode.com
首页 > 其他好文 > 详细

总结(18.6.1)

时间:2018-06-02 00:43:54      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:题目   前缀和   类型   style   模板函数   现在   总结   函数   turn   

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

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

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

线段树的模板函数:

 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)

标签:题目   前缀和   类型   style   模板函数   现在   总结   函数   turn   

原文地址:https://www.cnblogs.com/JRZZTD/p/9123865.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!