樹狀陣列的基本 運用(HDU1166 敵兵布陣)

2021-08-04 11:11:51 字數 1758 閱讀 7203

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

**情報局要研究敵人究竟演習什麼戰術,derek需要隨時知道某一段連續的工兵營地一共有多少人,derek請你寫個程式幫他完成這項工作。

輸入第一行乙個整數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 表示結束,這條命令在每組資料最後出現;

每組資料最多有50000條命令

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

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

輸入樣列

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

輸出樣例

case 1:633

59仔細審題,注意字串的恰當使用,本題要輸出「case」,則需要乙個變數來確定這是第幾組資料。「sub」減就等於加上乙個負數,對源**進行略微的改動即可。

1

//樹狀陣列基本框架的搭建(維護和查詢都是o(lgn)的複雜度)

2 #include3 #include4 #include5 #include6 #include

7using

namespace

std;

8int tree[110000];9

intn,m;

1011

int lowbit(int

k)12

1516

void add(int k,int num)//

在某個位置新增乙個值,與他牽連的樹狀陣列的值都要更新

1723

} 24

2526

int sum(int k)//

求陣列1~k的和

2734

return

sum;35}

3637

38int

main()

39

55 printf("

case %d:\n

",kase);

56while(scanf("%s"

,k))

5760

else

61

71}

72}

73return0;

74 }

我第一次提交試用cin的,發現超時了,深切的再一次感受到cin不能隨便用。

hdu 1166 敵兵布陣 樹狀陣列的運用

題目連線 敵兵布陣 題面很好理解但是就是怎麼快速的求出一段區間的和,並且維護這個陣列。嘿嘿,這裡就用到了我剛才學的樹狀陣列,樹狀陣列處理這類問題簡直就是一把利器啊。來個傳送門 include include include include include include using namespac...

線段樹與樹狀陣列的綜合運用

前言 線段樹樹狀陣列是高階資料結構最基本的部分,資料結構又是省選最基本的部分,所以從他開始整理一下。題目以洛谷和bz為基底 1.基礎運用 資料結構最基本的問題就是操作和詢問的問題,修改可以分為點修改 包括點的函式運算 區間運算 區間最大最小和取模 區間set 其中點修改就是領出樹上的一條長鏈,對其末...

hdu 4970 陣列的巧妙運用)

題目大意 有一些塔,規定li,ri di 表示殺傷力,塔在同乙個格仔只能攻擊同乙個怪獸一次,怪獸從初始位置跑到n的位置,問有多少怪獸能夠活著 吐槽 一看題,果斷線段樹送分題,然而被騙了,o nlogn 的演算法很難過去,跟新的次數和查詢的次數太多了,不過有的人用線段樹加加速輸入險過,至少我的不行 然...