士兵殺敵(一)
時間限制:
1000
ms |
記憶體限制:
65535kb
難度:3
描述
南將軍手下有
n個士兵,分別編號1到
n,這些士兵的殺敵數都是已知的。
小工是南將軍手下的軍師,南將軍現在想知道第
m號到第
n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。
注意,南將軍可能會問很多次問題。
輸入
只有一組測試資料
第一行是兩個整數
n,m,其中
n表示士兵的個數
(1,m
表示南將軍詢問的次數
(1隨後的一行是
n個整數,
ai表示第
i號士兵殺敵數目。
(0<=ai<=100)
隨後的m
行每行有兩個整數
m,n,表示南將軍想知道第
m號到第
n號士兵的總殺敵數(
1<=m,n<=n)。
輸出
對於每乙個詢問,輸出總殺敵數
每個輸出佔一行
樣例輸入
5 2
1 2 3 4 5
1 32 4
樣例輸出6
9 這道題沒能自己寫出來,我想的方法是將這些士兵按照10人為一段,求出殺敵總數放在另乙個陣列中,當詢問的的界限包含了整段時,則直接使用10人的殺敵總數,遺憾的是仍舊超時,100人,1000人等等為一段也都超時。
就打算繼續優化,方法如下圖。
陣列名資料
kills_eight
36100
kills_four
1026
4258
kills_two37
1115
1923
2731
35kills12
3456
78910
1112
1314
1516
1718
kills_two 用來儲存kills中的相鄰每兩個一組的和,按照同樣的規則,kills_four儲存kills_two,kills_eight儲存kills_four。當求其中某一段的和時,例如a到b的和,如果以上四個陣列中的元素有剛好落在a到b中的,就相加,這樣可以省略一些重複計算。但是…仍然不過。好吧,我投降!只好搜解題報告了(其實上面的思想有點類似於樹,不過,我當時不知道樹啊)。
不得不說,這種解法,高明!簡單,高效。方法是讓陣列第k位儲存前k(包括第k位)位的和。如果要求a到b的和,結果就等於kills[b] – kills[a – 1]。
#includeint kills[1000010];
int main()
while(ask_num--)
return 0;
}
nyoj 108 士兵殺敵(一)
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。小工是南將軍手下的軍師,南將軍現在想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。注意,南將軍可能會問很多次問題。輸入 只有一組測試資料 第一行是...
NYOJ 108 士兵殺敵(一)
時間限制 1000 ms 記憶體限制 65535 kb難度 3 描述 南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。小工是南將軍手下的軍師,南將軍現在想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。注意,南將軍可能會問很多次問題。輸入 只有一組測試資料 第一行是兩...
NYOJ 108士兵殺敵(一)
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。小工是南將軍手下的軍師,南將軍現在想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。注意,南將軍可能會問很多次問題。輸入只有一組測試資料 第一行是兩...