還剩四天
想重新學樹狀數組的起因是洛谷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;
}