樹狀陣列還不會的可以看:
鑑於部落格中個別點說的很簡短,有時難以理解,這裡再補充一些,幫助理解:
關於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國都掌握的...