NYOJ 108 士兵殺敵(一) 解題報告

2021-08-26 20:09:42 字數 1541 閱讀 2330

士兵殺敵(一)

時間限制:

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號士兵的總殺敵數,請你幫助小工來回答南將軍吧。注意,南將軍可能會問很多次問題。輸入只有一組測試資料 第一行是兩...