看了很多讲解仍然不明就里,感觉反正代码很短,暂时当模板背过好了。
//树状数组 单点修改 区间查询 const int maxn=1005; int tree[maxn],n; void init() { for (int i=1;i<=n;i++) tree[i]=0; } //初始化一个长度为n的树状数组,n为全局变量 int lowbit(it k) { return k&-k; } void add(int k,int x) //给位置k加x { while (k<=n) { tree[k]+=x; k+=lowbit(k); } } int querysum(int k) //查询[1,k]的前缀和 { int sum=0; while (k>0) { sum+=tree[k]; k-=lowbit(k); } return sum; } void setvalue(int k,int x) //把位置k置为x { int t=query(k)-query(k-1); add(k,-t); add(k,x); }
时间: 2024-11-05 11:28:19