模板-线段树

Posted Pyl0j

tags:

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

  上课时候的笔记。仅供参考。

 1 #include <cstdio>
 2 
 3 struct Tree {
 4     int l, r;
 5     long long sum;
 6 } tr[1024000];
 7 int a[1024000];
 8 
 9 void Build_Tree ( int x , int y , int i ) {
10     tr[i].l = x;
11     tr[i].r = y;
12     if( x == y )tr[i].sum = a[x] ;                             //到叶子节点,赋值
13     else {
14         int mid = (tr[i].l + tr[i].r ) / 2 ;
15         Build_Tree ( x , mid , i * 2);                         //左子树
16         Build_Tree ( mid + 1 , y , i * 2 + 1);                 //右子树
17         tr[i].sum = tr[i * 2].sum + tr[i * 2 + 1].sum;         //回溯维护区间和
18     }
19 }
20 
21 long long Query_Tree ( int q , int w , int i ) {
22     if ( q <= tr[i].l && w >= tr[i].r ) return tr[i].sum;   //当前结点的区间完全被目标区间包含
23     else {
24         long long mid = (tr[i].l + tr[i].r) / 2;
25         if( q > mid ) {                                     //完全在左儿子
26             return Query_Tree ( q , w , i * 2 + 1);
27         } else if (w <= mid ) {                             //完全在右儿子
28             return Query_Tree ( q , w , i * 2);
29         } else {                                             //目标区间在左右都有分布
30             return Query_Tree ( q , w , i * 2) + Query_Tree ( q , w , i * 2 + 1 );
31         }
32     }
33 }
34 
35 int main ( ) {
36     int N, M, q, val, l, r;
37     scanf("%d", &N);
38     for ( int i = 1 ; i <= N ; i++ )scanf("%d", &a[i]);
39     Build_Tree ( 1 , N , 1);
40     scanf("%d%d", &l, &r);
41     printf("%lld\n", Query_Tree ( l , r, 1 ));
42     return 0 ;
43 }

 

以上是关于模板-线段树的主要内容,如果未能解决你的问题,请参考以下文章

线段树模板整理

线段树模板总结

线段树模板

模板线段树-单点修改,区间查询

P3834 模板可持久化线段树 1(主席树)

模板 线段树(部分功能)