码迷,mamicode.com
首页 > 编程语言 > 详细

树状数组—模板整理

时间:2017-05-09 17:42:35      阅读:283      评论:0      收藏:0      [点我收藏+]

标签:owb   区间查询   更新   while   sum   namespace   查询   lowbit   定义   

树状数组整理

update 更新

1.单点更新,将第p个数增加v

1 void update(int p,int v)    //将第P个数增加v 
2 {
3     while(p<=n)
4     {
5         sum[p] += v;
6         p += lowbit(p);  
7     }    
8 } 

2.区间更新,将区间[x,y]增加v

1 void inerval_update(int x,int y,int v)  //区间修改—[x,y]的区间增加v 
2 {
3     update(x,v);
4     update(y+1,-v);
5 } 

  或者直接在输入时加上这两行代码,下面有

附:单点改变,将第p个数变成v,还要定义一个储存初始值的数组a。

1 void modify(int p,int v)    //将第p个数变成v 
2 {
3     int d = v - a[p];        //d表示 增加了多少 
4     while(p<=n)
5     {
6         sum[p] += d;
7         p+=lowbit(p);
8     }
9 }

 

query 查询

1.单点查询,查询第p个点的值

 1 int query(int p)    //查询第p个点的值是多少 
 2 {
 3     int ans=0;
 4     while(p)
 5     {
 6         ans += sum[p];
 7         p -= lowbit(p);
 8     }
 9     return ans;
10 }

2.区间查询,查询区间[x,y]的值 (也可以在输入时直接加两行代码,下面有)

1 int interval_query(int x,int y)        //查询区间[a,b]的值是多少 
2 {
3     return query(y) - query(x-1);
4 }

合起来就成这样了

 1 #include<iostream>
 2 using namespace std;
 3 
 4 const int N = 100100 ;
 5 
 6 int n,m,a;
 7 int ch,x,y,v;
 8 int sum[N];//树状数组 
 9 
10 int lowbit(int x)         
11 {
12     return x&(-x);
13 }
14 
15 void update(int p,int v)    //将第P个数增加v 
16 {
17     while(p<=n)
18     {
19         sum[p] += v;
20         p += lowbit(p);  
21     }    
22 } 
23  
24 int query(int p)    //查询第p个点的值是多少 
25 {
26     int ans=0;
27     while(p)
28     {
29         ans += sum[p];
30         p -= lowbit(p);
31     }
32     return ans;
33 }
34 
35 void interval_update(int x,int y,int v)  //区间修改—[x,y]的区间增加v 
36 {
37     update(x,v);
38     update(y+1,-v);
39 } 
40 
41 int interval_query(int x,int y)        //查询区间[a,b]的值是多少 
42 {
43     return query(y) - query(x-1);
44 }
45 
46 int main()
47 {
48     cin>>n>>m;
49     for (int i=1;i<=n;i++) 
50     {
51         cin>>a;
52         update(i,a);  //建树 
53     }
54     for (int i=1;i<=m;++i) 
55     {
56         cin>>ch;
57         if (ch==1)        //单点修改 
58         {
59             cin>>x>>y;
60             update(x,y);
61         }
62         if (ch==2)        //区间修改 
63         {
64             cin>>x>>y>>v;
65             update(x,v);
66               update(y+1,-v);  //interval_update(x,y,v); 
67         }
68         if (ch==3)        //单点查询 
69         {
70             cin>>x;            
71             cout<<query(x); 
72         }
73         if (ch==4)        //区间查询
74         {
75             cin>>x>>y;            
76             cout<<query(y)-query(x-1)<<endl;  //cout<<interval_query(x,y)
77         } 
78     }
79     return 0;
80 }
81 /*
82 //附  改变值 还需定义 a[] 记录初始值 
83 void modify(int p,int v)    //将第p个数变成v 
84 {
85     int d = v - a[p];        //d表示 增加了多少 
86     while(p<=n)
87     {
88         sum[p] += d;
89         p+=lowbit(p);
90     }
91 }
92 */

 

树状数组—模板整理

标签:owb   区间查询   更新   while   sum   namespace   查询   lowbit   定义   

原文地址:http://www.cnblogs.com/mjtcn/p/6831522.html

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