【CSP2019準備】樹狀數組

還剩四天
想重新學樹狀數組的起因是洛谷P1966
其實這題和樹狀數組關係不大,只是求逆序對的時候要用到,反正之前不會,就去看了一下,我本來因爲會線段樹所以基本沒有學樹狀數組,但樹狀數組的常數更小,用起來也更方便,所以記錄下來。

基礎

名爲lowbit的函數,設k爲x的最低位的1,那麼lowbit可以算出2^(k-1)。
具體數學證明我也不會,總之記下來就行了。

inline int lowbit(int k)
{
	return (k&(-k));
}

組成部分

樹狀數組基本只有兩種操作,單點修改和區間查詢,區間查詢查詢的是前綴和,所以可以相減求得一段區間。

單點修改

void add(int i)
{
	while(i<=n)
	{
		c[i]++;
		c[i]=c[i];
		i+=lowbit(i);
	}
}

求前綴和

ll getsum(int i)
{
	ll sum=0;
	while(i>0)
	{
		sum+=c[i];
		sum=sum;
		i-=lowbit(i);
	}
	return sum;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章