題目:
基維百科:
樹狀陣列原始碼及部分注釋:
#include#include#define max 50010
int n;
int per[max],c[max];
int lowbit(int n)
void update(int i,int x)//更新值
}int check(int n)//求從第乙個數到第n個數的和
return sum;
}int main()
printf("case %d:\n",num++);
while(scanf("%s",str) && str[0] != 'e')
}} return 0;
}
線段樹(segment tree)是一種二叉搜尋樹,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。
對於線段樹中的每乙個非葉子節點[a,b],它的左兒子表示的區間為[a,(a+b)/2],右兒子表示的區間為[(a+b)/2+1,b]。因此線段樹是平衡二叉樹。葉節點數目為n,即整個線段區間的長度。
使用線段樹可以快速的查詢某乙個節點在若干條線段中出現的次數,時間複雜度為o(logn)。而未優化的空間複雜度為2n,因此有時需要離散化讓空間壓縮。
線段樹求解源**及部分注釋:
#include#include#include#define maxn 50010
struct node
st[maxn * 6];
void build(int curnode,int left,int right)//建立線段樹,
void update(int curnode,int seq,int cnt)
}int total;
void sum(int curnode,int left,int right)
}int main()
printf("case %d:\n", c++);
*** = 1;
while( scanf("%s",ins) != eof && ins[0] != 'e')
}} return 0;
}
1166 敵兵布陣 樹狀陣列
網路上面都有這個圖,但是我將這個圖做了2點改進。1 圖中有一棵滿二叉樹,滿二叉樹的每乙個結點對應a中的乙個元素。2 c i 為a i 對應的那一列的最高的節點。現在告訴你 序列c就是樹狀陣列。那麼c如何求得?c 1 a 1 c 2 a 1 a 2 c 3 a 3 c 4 a 1 a 2 a 3 a ...
HDU 1166 敵兵布陣 樹狀陣列
用樹狀陣列很簡單,太晚了,貼下 睡覺去。另,研究線段樹的時候,發現網上流傳著有幾種不同的線段樹,最正宗的是以單位區間為單位,只能處理線段 另外還有幾種葉子結點是點的,這種也可以用來處理點,所以這題是可以用這種線段樹做的。還搞不太清楚它們之間的關係。mark一下,明天再說。include includ...
HDU 1166 敵兵布陣 樹狀陣列
problem description c國的死對頭a國這段時間正在進行軍事演習,所以c國間諜頭子derek和他手下tidy又開始忙乎了。a國在海岸線沿直線布置了n個工兵營地,derek和tidy的任務就是要監視這些工兵營地的活動情況。由於採取了某種先進的監測手段,所以每個工兵營地的人數c國都掌握的...