int tree[100001];//树状数组,用于取区间[x,y]的数据的和 /* & 特殊运算,t&(-t)的值(十进制),就是t在2进制下,从右往左数第一个1出现的位置。 结合树状数组的特殊性质,这个值有用 */ int lowbit(int t) { return t&(-t); } /* 假设对处在数组序号x的数据进行了更改,让x位置的数据有了增量v 对树状数组进行如下修改,使相关的包含x位数据的和都增加v 根据树状数组的性质,也就是对下标为 x, x+lowbit(x), x+lowbit(x+lowbit(x))....的数据都加v */ void add(int x,int v) { for(int i=x; i<=100000; i+=lowbit(i)) tree[i]+=v; } /* 取区间[0,x]的数据的和 */ int getsum(int x) { int ans=0; for(int i=x;i>0;i-=lowbit(i)) ans+=tree[i]; return ans; } /* 二分查找,进一步减少时间复杂度 */ int binarySearch(int l, int r, int median) { int mid ; while (l<=r) { mid = (l+r)/2; if (getsum(mid)<median) l = mid+1; //注意此处是 >= else if (getsum(mid)>=median) r = mid-1; else return mid; } return l; }
原文地址:https://www.cnblogs.com/OranBlog/p/9012351.html
时间: 2024-10-02 06:09:48