大致思路:
可以轉化成「看這個點被多少個區間所重疊」的問題。
剛開始的想法是用暴力什麼的,當然是還有最優的辦法,但說實話,想半天沒想到用樹狀陣列怎麼做。
後來漸漸明白:「乙個序列排了很多個點」,題目和「區間」有關——由此聯想到樹狀陣列
但是這裡的問題在於「單點更新」上,難道輸入的區間內的每乙個單點都去更新一下?這樣區間長度一大之後複雜度不也是很高嗎?這還不如暴力呢
畫了個圖就明白了:
縱觀這個序列,對於紅點來說,需要求覆蓋它的區間的個數——只需要求「它及它前面的左端點」減去"它前面的右端點"
。(理解左右端點數量對應關係)。
所以就用兩個樹狀陣列,每次輸入只需單點更新左端點和右端點,這樣最後也根據思路簡便地用上了區間查詢。
我的ac**:
#include#includeusing namespace std;
const int maxn=1e5+10;
int c1[maxn],c2[maxn];
int n;
int sum(int *c,int i)
return res;
}void add(int *c,int i)
} int main()
//int sum1=sum(c1,n); //所有左端點的個數
//int sum2=sum(c2,n); //所有右端點的個數
for(int i=1;i<=n;i++)
return 0;
}
計蒜客木樁塗塗看
個木樁排成一排,從左到右依次編號為 1,2,3 n1,2,3 n。每次給定 22 個整數 a,b a b 蒜頭君便騎上他的電動車從木樁 a 開始到木樁 b 依次給每個木樁塗一次顏色。但是 n 次以後 lele 已經忘記了第 i 個木樁已經塗過幾次顏色了,你能幫他算出每個木樁被塗過幾次顏色嗎?輸入格式...
樹狀陣列1 樹狀陣列入門
仔細看一下,發現tree的每乙個節點的高度並不是隨意的,而是由它轉成二進位制之後末尾連續零的數量決定的,連續零的數量加1,就是高度,例如 3 11 零的數量為0,加1等於1,所以它的高度就是1 6 110 零的數量為1,加1等於2,所以它的高度就是2 8 1000 零的數量為3,加1等於4,所以它的...
樹狀陣列 瞎bb 樹狀陣列
樹狀陣列是乙個利用一維陣列和位運算組成的求解區間問題的高效資料結構,其構造如圖所示 首先,我們要用它解決單點修改 區間查詢的操作。根據這張圖我們建立乙個陣列bit,下標就是圖中顯示的十進位制數。bit i 就表示了圖中所示的一段區間的和,例如bit 6 sum 5,6 bit 4 sum 1,4 下...