Hdu1166 樹狀陣列模板題

2021-09-25 18:30:43 字數 2024 閱讀 5199

樹狀陣列還不會的可以看:

鑑於部落格中個別點說的很簡短,有時難以理解,這裡再補充一些,幫助理解:

關於iupq模型的理解:

iupq模型:區間更新,點查詢。

切入點:差分陣列

設原陣列為a = a, b, c, d, e。差分陣列b = a, b-a, c-b, d-c, e-d。

可以看出a[n] = b[1] + b[2] + …+ b[n]。字首和!

當需要從[l, r]加v時,可以看到,只有原陣列[l, r]區間的交界處的差值變了,區間內部的差值並沒有改變,所以只更新交界處即可:b[l] + v就代表著a[l] 到 a[n]所有數都 + v,

而在b[r+1]處將[r+1, n]區間的 +v 效果消除,即b[r+1] - v。

還是舉個例子,設陣列a=,那麼差分陣列b=

也就是說b[i]=a[i]-a[i-1];(a[0]=0;),那麼a[i]=b[1]+…+b[i];(這個很好證的)。

假如區間[2,4]都加上2的話

a陣列變為a=,b陣列變為b=;

發現了沒有,b陣列只有b[2]和b[5]變了,因為區間[2,4]是同時加上2的,所以在區間內b[i]-b[i-1]是不變的.

所以對區間[x,y]進行修改,只用修改b[x]與b[y+1]:

b[x]=b[x]+k;b[y+1]=b[y+1]-k;

關於逆序對模型的理解:

問題模型,給定n個整數,求出逆序整數對數(即a[u] > a[v] && u < v的整數對)

看見題目我們就可以寫出o(n2)的暴力for來求解,但是如何將其用樹狀陣列來優化到o(nlogn)呢

這裡用到桶排序的思想.

首先讓問題簡單化一點,讓n個整數a[i]均小於等於100.

那麼我們就可以開tree[105]的陣列,每次讀入更新乙個數時,只需update(a[i],1)

此時,比a[i]大的數字就是需要更新的逆序對對數,即query(a[100]) - query(a[i])因為當前共讀入了i個數,那麼求值亦可簡化為i - query[a[i]]

也就是讀入一輪+每次查詢就可得到總共的逆序對對數.時間複雜度o(nlogn)。

那麼當資料足夠大時,我們的陣列存不下的時候呢,這時候,就輪到我們的核心思想,離散化出場了.

對於離散化,個人理解就是由於想要利用桶陣列,故將資料相對縮小(保證相對大小不變)到可以開到的陣列那麼大而減小空間需求。還是舉個例子,比如乙個陣列初始為:10, 14523578, 564, 5, 484184164。對這個陣列而言,最大的數要484184164,,直接開陣列顯然是不行的,由於逆序對並不關心具體的值是多少,只關心相對大小,所以我們大可以改變其值,只要保證其相對大小即可,例如總共有5個數,可以依次按照大小順序,將陣列變為2,4,3,1,5。

hdu1166

// 點更新,區間查詢——puiq模型 

#include #include #include #include #pragma comment(linker, "/stack:102400000,102400000")

typedef long long ll;

const int inf = 0x3f3f3f3f;

const int maxn = 50000+5;

using namespace std;

int n, c[maxn];

char op0[10] = "end", op1[10] = "add", op2[10] = "sub",op3[10] = "query", str[10];

int lowbit(int x)

void add(int x, int v)

int sum(int x)

int main()

printf("case %d:\n", kase++);

do}while(1);

} fclose(stdin);

return 0;

}

樹狀陣列 HDU1166

繼續上次那題,我們現在採用樹狀陣列來解。樹狀陣列主要用來進行區間求和統計和定點更新操作,樹狀陣列的儲存是如下方式的 假設陣列a為a 1 a 2 a 3 a n 現在我們另陣列c 1 a 1 c 2 a 1 a 2 c 3 a 3 c 4 a 1 a 2 a 3 a 4 這是啥結構呢?其實c i a ...

樹狀陣列 HDU1166

題意為 t組測試陣列,跟著乙個整數n,n n 50000 表示n個營地 n後面跟著n個數ai 1 50 表示每個營地人數。然後輸入三種操作 最多有40000條操作 1.add x y x營地增加y人。2.query x y 查詢x y營地的總人數。3.sub x y x營地減少y人。end 結束。如...

Hdu1166 樹狀陣列

problem description c國的死對頭a國這段時間正在進行軍事演習,所以c國間諜頭子derek和他手下tidy又開始忙乎了。a國在海岸線沿直線布置了n個工兵營地,derek和tidy的任務就是要監視這些工兵營地的活動情況。由於採取了某種先進的監測手段,所以每個工兵營地的人數c國都掌握的...