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的最大位置
}

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