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

模板-线段树

时间:2017-10-13 00:24:59      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:区间   sum   val   printf   节点   目标   包含   class   else   

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

 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 }

 

模板-线段树

标签:区间   sum   val   printf   节点   目标   包含   class   else   

原文地址:http://www.cnblogs.com/wuyuema/p/7658825.html

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