HDU1166 線段樹模版 敵兵布陣

2021-06-28 14:40:16 字數 1244 閱讀 4824

這種型別是線段樹,關於線段樹,線段樹是一種二叉搜尋樹,與區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。

對於線段樹中的每乙個非葉子節點[a,b],它的左兒子表示的區間為[a,(a+b)/2],右兒子表示的區間為[(a+b)/2+1,b]。因此線段樹是平衡二叉樹,最後的子節點數目為n,即整個線段區間的長度。

使用線段樹可以快速的查詢某乙個節點在若干條線段中出現的次數,時間複雜度為o(logn)。而未優化的空間複雜度為2n,因此有時需要離散化讓空間壓縮。參照這個圖理解下

建樹:

void build(int left,int right,int i)

mid=(left+right)/2;

build(left,mid,2*i);

build(mid+1,right,2*i+1);

b[i].sum=b[2*i].sum+b[2*i+1].sum; }

查詢:int query(int left, int right,int i)

刪除,增加:

void add(int id,int num,int i)

else

}  所以,有了以上函式,這道題就不會超時了啊

#include #include int a[50010];struct node

b[150010];

void build(int left,int right,int i)

mid=(left+right)/2;

build(left,mid,2*i);

build(mid+1,right,2*i+1);

b[i].sum=b[2*i].sum+b[2*i+1].sum; }

void add(int id,int num,int i)

else

} int query(int left, int right,int i)

int main()

build(1,n,1);

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

while(1)

if(strcmp(str,"add")==0)

if(strcmp(str,"sub")==0)}}

return 0;

}

線段樹 hdu1166 敵兵布陣

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

敵兵布陣 HDU 1166 線段樹

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

敵兵布陣 HDU 1166(線段樹)

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