poi 2182 2828 树状数组倍增查询

这种题的主要目的是找位置, 比如第一个前缀和等于k的位置,

1. 可以用树状数组 + 二分, 时间为logn * logn, 这样时间稍微慢了些;

2. 用倍增法这片博文写得很好, http://www.hawstein.com/posts/binary-indexed-trees.html

int getKPos(int k){
        int bitMask = bthPow[upper_bound(bthPow, bthPow + MAXBTH, size) - bthPow - 1];
        int bitStart = 0;
        while(bitMask){
            if(bitStart + bitMask <= size){
                if(bit[bitStart + bitMask] < k){
                     k -= bit[bitStart + bitMask];
                     bitStart += bitMask;
                }
            }
            bitMask >>= 1;
        }
        return 1 + bitStart;// 注意这里的加一, 因为当前的前缀和是不满足等于k的最大位置
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章