一维线段树

下面是一维线段树的例子,它是建立了一棵树,叶子上的value等于在数组中下标为叶子左右节点的值。

这个题目是要求输入一个数字序列,然后输入一个区间,求出区间内的值的和。

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 const int N=1000;
 5 int result;
 6 struct Node
 7 {
 8     int left,right,value;
 9 };
10 Node node[N];
11 int data[N];
12 void build(int l,int r,int i)
13 {
14     node[i].left=l;
15     node[i].right=r;
16     node[i].value=0;
17     if(l==r)return;
18     int mid=(l+r)>>1;
19     build(l,mid,2*i+1);
20     build(mid+1,r,2*i+2);
21 }
22 void compute(int l,int r,int i)
23 {
24     if(l==r)
25     {
26         node[i].value=data[l];
27         return;
28     }
29     else if(l+1==r)
30     {
31         node[2*i+1].value=data[l];
32         node[2*i+2].value=data[r];
33         node[i].value=data[l]+data[r];
34         return;
35     }
36     compute(l,node[2*i+1].right,2*i+1);
37     compute(node[2*i+2].left,r,2*i+2);
38     node[i].value=node[2*i+1].value+node[2*i+2].value;    
39 }
40 void  query(int l,int r,int i)
41 {
42     if(node[i].left==l&&node[i].right==r)
43     {
44         result+=node[i].value;
45         return;
46     }
47     if(r<=node[2*i+1].right)query(l,r,2*i+1);
48     else if(l>=node[2*i+2].left)query(l,r,2*i+2);
49     else 
50     {
51         query(l,node[2*i+1].right,2*i+1);
52         query(node[2*i+2].left,r,2*i+2);
53     }
54 }
55 int main()
56 {
57     int n,m;
58     while(cin>>n)
59     {
60         build(0,n-1,0);
61         for(int i=0;i<n;i++)
62         cin>>data[i];
63         compute(0,n-1,0);
64         cin>>m;
65         int a,b;
66         for(int i=0;i<m;i++)
67         {    
68             result=0;
69             cin>>a>>b;
70             query(min(a-1,b-1),max(a-1,b-1),0);
71             cout<<result<<endl;
72         }
73     }
74     return 0;
75 }
What I don't dare to say is I can't!
原文地址:https://www.cnblogs.com/sytu/p/3900784.html