HDU1166 線段樹區間求和,單點更新

2021-08-01 11:15:55 字數 2339 閱讀 7055

problem description

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

**情報局要研究敵人究竟演習什麼戰術,所以tidy要隨時向derek匯報某一段連續的工兵營地一共有多少人,例如derek問:「tidy,馬上匯報第3個營地到第10個營地共有多少人!」tidy就要馬上開始計算這一段的總人數並匯報。但敵兵營地的人數經常變動,而derek每次詢問的段都不一樣,所以tidy不得不每次都乙個乙個營地的去數,很快就精疲力盡了,derek對tidy的計算速度越來越不滿:"你個死肥仔,算得這麼慢,我炒你魷魚!」tidy想:「你自己來算算看,這可真是一項累人的工作!我恨不得你炒我魷魚呢!」無奈之下,tidy只好打**向計算機專家windbreaker求救,windbreaker說:「死肥仔,叫你平時做多點acm題和看多點演算法書,現在嚐到苦果了吧!」tidy說:"我知錯了。。。"但windbreaker已經掛掉**了。tidy很苦惱,這麼算他真的會崩潰的,聰明的讀者,你能寫個程式幫他完成這項工作嗎?不過如果你的程式效率不夠高的話,tidy還是會受到derek的責罵的.

input

第一行乙個整數t,表示有t組資料。

每組資料第一行乙個正整數n(n<=50000),表示敵人有n個工兵營地,接下來有n個正整數,第i個正整數ai代表第i個工兵營地里開始時有ai個人(1<=ai<=50)。

接下來每行有一條命令,命令有4種形式:

(1) add i j,i和j為正整數,表示第i個營地增加j個人(j不超過30)

(2)sub i j ,i和j為正整數,表示第i個營地減少j個人(j不超過30);

(3)query i j ,i和j為正整數,i<=j,表示詢問第i到第j個營地的總人數;

(4)end 表示結束,這條命令在每組資料最後出現;

每組資料最多有40000條命令

output

對第i組資料,首先輸出「case i:」和回車,

對於每個query詢問,輸出乙個整數並回車,表示詢問的段中的總人數,這個數保持在int以內。

sample input

1

101 2 3 4 5 6 7 8 9 10

query 1 3

add 3 6

query 2 7

sub 10 2

add 6 3

query 3 10

end

sample output

case 1:633

59

開始學習線段樹啦  這幾天先把hud上面比較水的線段樹題目給敲一遍先  最基礎的線段樹,區間求和,單點更新數值。**比較簡單。。

ac**

#include#includestructtree[150011];

void createtree(int left,int right,int root) //遞迴建立線段樹

else

}void update(int num,int ad,int root)

mid=(tree[root].left+tree[root].right)/2;

if(num<=mid)

update(num,ad,root*2);

else

update(num,ad,root*2+1);

tree[root].sum=tree[root*2].sum+tree[root*2+1].sum; //父節點數值更新

}void dreacase(int num,int ad,int root)

mid=(tree[root].left+tree[root].right)/2;

if(num<=mid)

dreacase(num,ad,root*2);

else

dreacase(num,ad,root*2+1);

tree[root].sum=tree[root*2].sum+tree[root*2+1].sum;

}long long query(int left,int right,int root)

int main()

else if(strcmp(zl,"sub")==0)

else

}} }

return 0;

}

線段樹HDU 1166(單點增減 區間求和)

應用 區間最值查詢問題 區間求和 連續區間的修改或單點更新 例題 hdu 1166敵兵布陣 線段樹功能 add 單點增減 sum 區間求和 include include include include include include includeusing namespace std defin...

線段樹入門(hdu 1166)點修改 區間求和

hdu1166 題意 中文題。線段樹的入門題,線段樹是支援一種區間操作的資料結構,時間複雜度能在o m logn 時間內完成,m是操作次數,線段樹是一種樹結構,每次不管是修改單點的值還是求和,只用維護一條簡單路勁 從根到葉子節點 能在logn時間內完成,中建樹過程從下到上建樹,更新也是從下到上 in...

敵兵布陣 HDU 1166 (求和線段樹模板)

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