首页 > 代码库 > 树状数组—模板整理

树状数组—模板整理

树状数组整理

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 */

 

树状数组—模板整理