樹狀陣列詳解與模版

2022-05-24 08:48:11 字數 2981 閱讀 4199

單點更新

void update(int x,int y,int

n)

區間查詢(1 - x)

int getsum(int

x)

對於陣列a,我們將其離散化處理為b.區間查詢與單點修改**如下

int lowbit(int

x) void update(int

p) }

int getsum(int

p)

return

res;

}

a的逆序對個數為:

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

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;#define bug printf("*********\n")

#define debug(x) cout<

int maxn = 5e5 + 10

;const

double eps = 1e-8

;int

c[maxn];

intn;

inta[maxn],b[maxn];

int lowbit(int

x) void update(int

p) }

int getsum(int

p)

return

res;

}int

main()

sort(a + 1, a + 1 +n);

int cnt = unique(a + 1, a + 1 + n) - a - 1

;

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

b[i] = lower_bound(a + 1, a + 1 + cnt, b[i]) -a;

ll res = 0

;

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

printf(

"%lld\n

",res);}}

view code

res就是逆序對個數,ask,需注意b[i]應該大於0

用這個做區間修改區間求和的題,無論是時間上還是空間上都比帶lazy標記的線段樹要優。

樹狀陣列模版

1.一維樹狀陣列 獲得2 k public static int lowbit int i 修改結點 public static void add int i,int value 求和 public static int getsum int i return sum 2.二維樹狀陣列 public...

樹狀陣列模版

單點更新,區間求和 include include using namespace std const intmaxn 1e6 1 inta maxn c maxn intmaxnum 1e6 intlowbit intx intsum intx return res void add intx,i...

樹狀陣列模版

原來聽到樹狀陣列這名字感覺很難,很高大上。學了一下發現不難。而且很好。普通的陣列修改某個值耗費為o 1 輸出和為o n 而樹狀陣列為o logn lowbit x 返回的是x二進位制最後一位1的位置 有公式 cn a n a k 1 an 其中 k 為 n 的二進位制表示中從右往左數的 0 的個數 ...