本題使用樹狀陣列果然更加快。
樹狀陣列難點:
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...