所谓树状数组二分,就是在树状数组上进行二分
(逃)
解析
很巧妙
我们都知道可以在线段树上利用其本身平衡二叉的性质进行二分,很多时候能剩下一个log
但是树状数组其实也是可以二分的
说是二分,其实更像倍增
毕竟不同于线段树,树状数组这个数据结构本身就是基于二进制实现的
从大到小枚举幂次,然后判断如果指针可以移过去就移动
还需要一个累加器记录沿路累加的 f 数组的和
代码长度再次吊打线段树
代码
这个是在单调不增的数组中找到最后一个>=val的位置
inline int find(int val){int res=0,pl=0;for(int k=18;k>=0;k--){if(pl+mi[k]>n||res+f[pl+mi[k]]<val) continue;pl+=mi[k];res+=f[pl];}return pl;
}