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

数据结构--线段树

时间:2016-11-04 07:35:47      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:结构   isp   strong   com   size   pen   queue   space   while   

线段树 好久没做全部忘记了 还得重新学一下了

线段树--单点更新

HUD1166

题意:中文题

思路:线段树的单点更新

AC代码

技术分享
 1 #include "iostream"
 2 #include "string.h"
 3 #include "stack"
 4 #include "queue"
 5 #include "string"
 6 #include "vector"
 7 #include "set"
 8 #include "map"
 9 #include "algorithm"
10 #include "stdio.h"
11 #include "math.h"
12 #define ll long long
13 #define mem(a) memset(a,0,sizeof(a))
14 using namespace std;
15 
16 struct Node{
17     int l,r;
18     int sum;
19 };
20 Node Tree[100000<<2];
21 
22 void Build_Tree(int root, int l, int r)
23 {
24     Tree[root].l=l;
25     Tree[root].r=r;
26     if(l==r)
27     {
28         scanf("%d",&Tree[root].sum);
29         return;
30     }
31     int mid=l+r>>1;
32     Build_Tree(root*2+1,l,mid);
33     Build_Tree(root*2+2,mid+1,r);
34     Tree[root].sum=Tree[root*2+1].sum+Tree[root*2+2].sum;
35 }
36 
37 int Query(int root,int l,int r)
38 {
39     if(Tree[root].l==l && Tree[root].r==r)
40         return Tree[root].sum;
41     int mid=Tree[root].l+Tree[root].r>>1;
42     if(r<=mid)
43         return Query(root*2+1,l,r);
44     if(l>mid)
45         return Query(root*2+2,l,r);
46     else
47         return Query(root*2+1,l,mid)+Query(root*2+2,mid+1,r);
48 }
49 
50 void Update_One(int root,int l,int r,int p,int add)
51 {
52     if(l==r)
53     {
54         Tree[root].sum += add;
55         return;
56     }
57     int mid=l+r>>1;
58     if(p<=mid)  Update_One(root*2+1,l,mid,p,add);
59     else Update_One(root*2+2,mid+1,r,p,add);
60     Tree[root].sum=Tree[root*2+1].sum + Tree[root*2+2].sum;
61 }
62 
63 int main()
64 {
65     int t,c=0,n,l,r;
66     string s;
67     scanf("%d",&t);
68     while(t--){
69             printf("Case %d:\n",++c);
70         scanf("%d",&n);
71         mem(Tree);
72         Build_Tree(0,0,n-1);
73         while(cin>>s&&s!="End")
74         {
75             scanf("%d%d",&l,&r);
76             if(s=="Query")  printf("%d\n",Query(0,l-1,r-1));
77             else if(s=="Add")  Update_One(0,0,n-1,l-1,r);
78             else Update_One(0,0,n-1,l-1,-r);
79         }
80     }
81    return 0;
82 }
View Code

 HDU1754

题意:中文题

思路:线段树的单点更新

代码有时间补上

数据结构--线段树

标签:结构   isp   strong   com   size   pen   queue   space   while   

原文地址:http://www.cnblogs.com/max88888888/p/6028880.html

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