wenbao與樹狀陣列(BIT)

2022-04-17 05:21:01 字數 3884 閱讀 6574

經典入門題,敵兵布陣

1 #include 2 #include 3 #include 

4using

namespace

std;56

int n,aa[50005],cc[50005];7

8int lowbit(int

x)11

12void add(int x,int

y)17}18

19int sum(int

x)25

return

s;26}27

28int

main()

40 printf("

case %d:\n

",countn);

41while(~scanf("%s"

,str))

49if(str[0]=='q'

)54if(str[0]=='s'

)59}60 countn++;61}

62return0;

63 }

給定n個高度,有m個詢問lr之間小於等於h的個數

1 #include 2 #include 3 #include 

4using

namespace

std;

5#define bt(x) x&(-x)

6const

int maxn = 1e5+10;7

intn, m, a[maxn], sum[maxn];

8struct

node

13}t[maxn];

14struct

node2

19}tt[maxn];

20void ad(int x, int

xx)25}26

int q(int

x)32

return

sum;33}

34int

main()

45 sort(t+1, t+n+1

);46

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

50 sort(tt+1, tt+m+1

);51

int num = 1

;52 printf("

case %d:\n

", tt);

53for(int i = 1; i <= m; ++i)

60 sum[tt[i].y] = q(tt[i].r+1) -q(tt[i].l);61}

62for(int i = 1; i <= m; ++i)65}

66return0;

67 }

一條街上住著n個桌球愛好者,有不同的能力值,每場比賽需要3個人(兩名選手一名裁判)要求裁判住在選手中間並且能力值在兩名選手中間,問一共可以組織多少種比賽

1 #include 2 #include 

3using

namespace

std;

4#define ll long long

5#define bt(x) x&(-x)

6const

int maxn = 1e5+10;;7

intt, n, a[maxn], b[maxn], c[maxn], d[maxn];

8void add(int x, int

y)13}14

int q(int

x)20

return

sum;21}

22int

main()

32 memset(d, 0, sizeof(int)*maxn);

33for(int i = n; i >= 1; --i)

37 ll sum = 0;38

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

41 printf("

%lld\n

", sum);42}

43return0;

44 }

神奇的bit

find函式,利用二進位制來快速求出第k大數,只需log複雜度

1 #include 2 #include 

3using

namespace

std;

4#define bt(x) x&(-x)

5const

int maxn = 200009;6

intn, a[maxn], b[maxn], sum[maxn], c[maxn];

7void add(int x, int

y)12}13

int f(int

x)else22}

23return xx+1;24

}25intmain()

32for(int i = n; i >= 1; --i)

37for(int i = 1; i <= n; ++i)40}

41return0;

42 }

區間更新

推薦部落格

自從有了它之後。。什麼?線段樹是什麼?

1 #include 2

using

namespace

std;

3#define ll long long

4#define bt(x) x&-x

5const

int maxn = 100009;6

intn, m, x, y;

7ll xx, c1[maxn], c2[maxn];

8void add(int

x, ll y)

11 ll f(int

x)16

intmain()

22char str[3

];23

for(int i = 0; i < m; ++i)else32}

33return0;

34 }

如果沒有x直接判斷逆序對奇偶性,否則判斷x個數的奇偶性(1要特判)

因為最後乙個放的人肯定可以放成勝態

1 #include 2 #include 3 #include 

4 #include 5

using

namespace

std;67

const

int m = 1e9+5;8

const

int maxn = 100009;9

char str[222

];10

int a[maxn], n, numx, numi = 1

, b[maxn], m[maxn];

1112

void add(int

x)17}18

19int f(int

x)25

return

sum;26}

2728

intq()

34return

num;35}

3637

intmain()

44if(!numx));

49if(q()&1) printf("

w\n"

);50

else printf("

l\n"

);51

return0;

52}53if(n == 1)56

if(numx&1) printf("

w\n"

);57

else printf("

l\n"

);58

return0;

59 }

只有不斷學習才能進步!

樹狀陣列 BIT

樹狀陣列模版 注意 樹狀陣列x必須 0,因為lowbit 0 0,會死迴圈 單點更新區間查詢 在log n 內修改單點,求出cnt x a 1 a x 之和 求區間 a,b 之和只要求出 sum b sum a 1 即可 define rep i,a,n for int i a i n i defi...

樹狀陣列(BIT)

樹狀陣列 bit 是能夠完成下述操作的資料結構。在解題過程中,我們有時需要維護乙個陣列的字首和s i a 1 a 2 a i 但是不難發現,如果我們修改了任意乙個a i s i s i 1 s n 都會發生變化。可以說,每次修改a i 後,調整字首和s在最壞情況下會需要o n 的時間。當n非常大時,...

BIT二叉索引樹(樹狀陣列)

powered by phantom lsh將上面的求連續和問題稍微改進一下,現在需要支援一種新的操作 add x d 即把a x 增加d。這樣一來,如果通過字首和的方式計算就不能簡化計算了,因為每次修改乙個元素都要修改所有在它後面的字首和。有什麼解決辦法呢?我們需要用一種新的資料結構 bit二叉索...