有关树状数组的优质博客:
模板代码:
(先前的)
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 }