HODJ1166敵兵布陣樹狀陣列和線段樹求解

2021-06-08 09:37:21 字數 1170 閱讀 8491

題目:

基維百科:

樹狀陣列原始碼及部分注釋:

#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國都掌握的...