hdu1394 樹狀陣列 解法

2021-12-30 05:29:37 字數 1128 閱讀 6257

本題使用樹狀陣列果然更加快。

樹狀陣列難點:

1 如何遍歷樹

2 如何利用陣列資料

建立乙個樹狀陣列就如上圖紅色部分代表所有的樹狀陣列節點了。

基本操作:

查詢下乙個節點的計算,如不明白下面函式的作用,請檢視負數記憶體存放的問題。

簡而言之就是:內存放是求反+1; 利用這個函式可以神奇地尋找到其單親節點和兄弟節點,比如上圖6->8,6->4或者7->8, 7 -> 6這樣跳轉節點。

這是樹狀陣列實現的關鍵了,理解了如何遍歷這樣的樹,就會使用這個資料結構了。

inline int lowbit(int x)

更新節點:

void update(int i, int val, int len)

}求和操作:

int getsum(int x)

return ans;

}主要是看圖,然後自己思考,看**吧。

解決這道題的**:

class minimuminversionnumber_3_treearray

void update(int i, int val, int len) }

int getsum(int x)

return ans;

}public:

minimuminversionnumber_3_treearray() : a((int*)malloc(sizeof(int)*size)),

c((int*)malloc(sizeof(int)*size))

//memset(c, 0, sizeof(c));最好不要使用memset設定初值

fill(c, c+n+1, 0);

int res = 0;

for(int i = 1; i <= n; i++)

int ans = res;

for(int i = 2; i <= n; i++)

printf("%d\n", ans);

}

} ~minimuminversionnumber_3_treearray()

};

hdu1394 線段樹 樹狀陣列

題目 就是求乙個陣列的逆序數,然後依次將陣列的第乙個數調到最後,最後求出最小的逆序數 做了兩種,線段樹和樹狀陣列 利用線段樹求逆序數 每次將數字x插到線段樹的 x 位置,然後球一下,該線段樹右邊的和,即為逆序數的個數 第一次用線段樹,做這個。include include include inclu...

hdu 1394 樹狀陣列求逆序數

解題思路 這道題是求迴圈陣列中逆序數最小值,求逆序數這裡肯定是用樹狀陣列。只是這裡有一點點變化,由於題目中n位數是0 n 1的乙個排列,所以num i 可表示為比num i 小的數的個數。把第一位的數挪到最後一位,那麼整個序列的逆序數變化為ans ans num 0 n 1 num 0 num 0 ...

HDU 1394 樹狀陣列求逆序數

題意 給你n個數,每次將其第乙個元素放後面,要你算出這期間所產生的最小逆序數。題解 首先用樹狀陣列求出原序列所產生的逆序數,然後根據性質算出公式sum n a i 1 a i 具體結合 更好理解。include include include using namespace std const in...