总结(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)的主要内容,如果未能解决你的问题,请参考以下文章