有关树状数组的优质博客:

 

 

 

模板代码:

(先前的)

 

 

  1 #include<iostream>
  2 #include<cstdio>
  3 
  4 using namespace std;
  5 
  6 //快读
  7 inline void read(int &x)
  8 {
  9     x=0;short flag(1);char ch=getchar();
 10     while(!isdigit(ch))
 11     {
 12         if(ch=='-') flag=-1;
 13         ch=getchar();
 14     }
 15     while(isdigit(ch))
 16     {
 17         x=(x<<1)+(x<<3)+ch-48;
 18         ch=getchar();
 19     }
 20     x*=flag;
 21 }
 22 
 23 //快写
 24 inline void write(int x)
 25 {
 26     if(x<0)
 27     {
 28         x=-x;
 29         putchar('-');
 30     }
 31     if(x>9) write(x/10);
 32     putchar(x%10+48);
 33 }
 34 
 35 inline int lowbit(int x)
 36 {
 37     return x & -x;
 38 }
 39 
 40 //一维-单点修改
 41 inline void update_value(int x,int k)
 42 {
 43     while(x<=n)
 44     {
 45         tree[x]+=k;
 46         x+=lowbit(x);
 47     }
 48 }
 49 
 50 //二维-单点修改
 51 inline void update_value(int x,int y,int k)
 52 {
 53     int tempy;
 54     while(x<=n)
 55     {
 56         tempy=y;
 57         while(tempy<=m)
 58         {
 59             tree[x][tempy]+=k;
 60             tempy+=lowbit(y);
 61         }
 62         x+=lowbit(x);
 63     }
 64 }
 65 
 66 //一维-更新最大值
 67 inline void update_max(int x,int k)
 68 {
 69     while(x<=n)
 70     {
 71         tree[x]=max(tree[x],k);
 72         x+=lowbit(x);
 73     }
 74 }
 75 
 76 //二维-更新最大值
 77 inline void update_max(int x,int y,int k)
 78 {
 79     while(x<=n)
 80     {
 81         int tempy=y;
 82         while(tempy<=n)
 83         {
 84             tree[x][y]=max(tree[x][y],k);
 85             tempy+=lowbit(y);
 86         }
 87         x+=lowbit(x);
 88     }
 89 }
 90 
 91 //一维-查询前缀和
 92 inline int query_sum(int x)
 93 {
 94     int res=0;
 95     while(x>0)
 96     {
 97         res+=tree[x];
 98         x-=lowbit(x);
 99     }
100     return res;
101 }
102 
103 //二维-查询前缀和
104 inline int query_sum(int x,int y)
105 {
106     long long res=0;
107     int tempy;
108     while(x>0)
109     {
110         tempy=y;
111         while(tempy>0)
112         {
113             res+=tree[x][tempy];
114             tempy-=lowbit(y);
115         }
116         x-=lowbit(x);
117     }
118     return res;
119 }
120 
121 //一维-查询最大值
122 inline int query_max(int x)
123 {
124     int res=-0x7f7f7f;
125     while(x>0)
126     {
127         res=max(res,tree[x]);
128         x-=lowbit(x);
129     }
130     return res;
131 }
132 
133 //二维-查询最大值
134 inline int query_max(int x,int y)
135 {
136     int res=-0x7f7f7f7f;
137     while(x>0)
138     {
139         int tempy=y;
140         while(tempy>0)
141         {
142             res=max(res,tree[x][y]);
143             tempy-=lowbit(y);
144         }
145         x-=lowbit(x);
146     }
147     return res;
148 }
149 
150 //一维-单点查询
151 inline int query_value(int x)
152 {
153     int res=tree[x];
154     int lca=x-lowbit(x);
155     x--;
156     while(x!=lca)
157     {
158         res-=tree[x];
159         x-=lowbit(x);
160     }
161     return res;
162 }

 

 

 

 

 

(在hyl大佬的指导下,现在的码风)

 

  1 #include<iostream>
  2 #include<cstdio>
  3 //宏定义lowbit 
  4 #define lowbit(x) ((x)&(-x))
  5 
  6 using namespace std;
  7 
  8 int n;
  9 int tree[10100];
 10 
 11 //快读 
 12 template<typename type>
 13 inline void read(type &x)
 14 {
 15     x=0;short flag(1);char ch=getchar();
 16     while(!isdigit(ch))
 17     {
 18         ch=='-'?flag=-1:0;
 19         ch=getchar();
 20     }
 21     while(isdigit(ch))
 22     {
 23         x=(x<<1)+(x<<3)+(ch^48);
 24         ch=getchar();
 25     }
 26     flag-1?x=-x:0;
 27 }
 28 
 29 //快写 
 30 template<typename type>
 31 inline void write(type x)
 32 {
 33     putchar(',');
 34     x<0?x=-x,putchar('-'):0;
 35     static short stack[30],top=0;
 36     do 37     {
 38         stack[++top]=x%10;
 39         x/=10;
 40     }while(x);
 41     while(top) putchar(stack[top--]|48);
 42     
 43     puts("");
 44 }
 45 
 46 //一维
 47 //单点修改 
 48 inline void update(int x,int k)
 49 {
 50     for(int i=x;i<=n;i+=lowbit(i)) tree[x]+=k;
 51 }
 52 
 53 //前缀和查询 
 54 inline int query_sum(int x)
 55 {
 56     int res=0;
 57     for(int i=x;i>0;i-=lowbit(i)) res+=tree[x];
 58     return res;
 59 }
 60 
 61 //单点查询 
 62 inline int query_value(int x)
 63 {
 64     int res=tree[x];
 65     int lca=x-lowbit(x);
 66     for(int i=x-1;i!=lca;i-=lowbit(i)) res-=tree[i];
 67     return res;
 68 }
 69 
 70 //单点更新最值 
 71 inline void update_max(int x,int k)
 72 {
 73     for(int i=x;i<=n;i+=lowbit(i)) tree[i]=max(tree[i],k);
 74 }
 75 
 76 //查询最值 
 77 inline int query_max(int x)
 78 {
 79     int res=0;
 80     for(int i=x;i>0;i-=lowbit(i)) res=max(res,tree[i]);
 81     return res;
 82 }
 83 
 84 //查找某个前缀和对应的前缀下标index 
 85 inline int query_index(int value)
 86 {
 87     int index=0;
 88     int mask=log2(n);
 89     while(mask!=lca)
 90     {
 91         find=index+mask;
 92         if(value>=tree[find])
 93         {
 94             index=find;
 95             value-=tree[find];
 96         }
 97         mask/=2;//通过二分步长mask进行二分查找 
 98     }
 99 }
100 
101 
102 //二维 
103 //单点修改 
104 inline void update(int x,int y,int k)
105 {
106     for(int i=x;i<=n;i+=lowbit(i))
107         for(int j=y;j<=m;j+=lowbit(j))
108             tree[i][j]+=k;
109 }
110 
111 //前缀和查询 
112 inline int query_sum(int x,int y)
113 {
114     int res=0;
115     for(int i=x;i>0;i-=lowbit(i))
116         for(int j=y;j>0;j-=lowbit(j))
117             res+=tree[i][j];
118     return res;
119 }
120 
121 //单点更新最值 
122 inline void update(int x,int y,int k)
123 {
124     for(int i=x;i<=n;i+=lowbit(i))
125         for(int j=y;j<=m;j+=lowbit(j))
126             tree[i][j]=max(tree[i][j],k);
127 }
128 
129 //查询最值 
130 inline int query_sum(int x,int y)
131 {
132     int res=-0x7f7f7f7f;
133     for(int i=x;i>0;i-=lowbit(i))
134         for(int j=y;j>0;j-=lowbit(j))
135             res=max(res,tree[i][j]);
136     return res;
137 }

 

相关文章: