從零開始的異世界生活(前綴和)
阿新 • • 發佈:2018-07-22
分別是 技術 ont ima 輸入數據 include 當前 後悔 前綴和
。486 在每一個時間點 i 上都會遭受心理傷害 hurt[i]。為什麽 486 的心理防線不會崩潰呢,當然因為有我們的蕾姆醬了,每次受到心理傷害的時候蕾姆醬都會治愈掉。第一季的目標便是走到時間點 n,現在需要你計算一下蕾姆醬的治愈總和(也就是 486 從時間點 0 到時間點 n 所遭受的心理攻擊的總和)。
Description
486 作為有史以來最悲慘的男主,我們知道他需要經歷一些無限次的死亡和輪回才能進行下一個關卡。
現在給你 n 個連續的時間點,每個時間點 i 上都會有一個心理傷害值 hurt[i],然後告訴你 m 個死亡時間點 deth[i],以及當前死亡時間點會死亡的次數 num[i],和死亡後 486 會返回的時間點(也就是最近的存檔點 return[i])。
其整個過程就是 486 從時間點 0 開始 (hurt[0] = 0),不斷向下一個時間點 1, 2, 3… 前進,當遇到死亡時間點的時候,486 會死亡一次,然後返回到最近的一個存檔點,然後會繼續從存檔點向下一個時間點前進,當又遇到死亡時間點的時候,如果死亡次數還不夠需要死亡的次數,那麽當前不能過關,繼續回到最近的存檔點。達到需要死亡的次數之後,便不需要死亡,繼續向下一個時間點前進
那麽萌萌的蕾姆醬到底治愈了多少呢~她這麽萌,你還不快告訴她麽~
Input
輸入數據有多組(數據組數不超過 30),到 EOF 結束。
對於每組數據:
- 第一行輸入兩個以空格分隔的整數 n 和 m
- n (1 <= n <= 100000) 表示 486 要到達的目標時間點(起始目標點 0,hurt[0] = 0,
- 接下來一行輸入 n 個以空格分隔的整數,表示 hurt[i]。表示 486 在當前時間點會遭受到的傷害值
- 接下來輸入 m (0 <= m <= n/2) 行,每行 3 個整數,分別是 deth[i],return[i] 和 num[i],表示 deth[i] 時間點需要死亡的次數以及會返回的最近的存檔點
保證:0 <= hurt[i] <= 100,1 <= deth[i-1] < return[i] < deth[i] <= n, 0 <= num[i] <= 100。
當前時間點如果不需要死亡,那麽486不會返回最近的存檔點,會繼續前進。
Output
對於每組數據,輸出一個整數,表示蕾姆醬總的治愈值(486 會遭受到的總的傷害值)。
Sample Input
10 3 1 2 3 4 5 5 4 3 2 1 4 2 1 6 5 2 10 9 1
Sample Output
62
打比賽的時候看了一眼這個題沒看懂什麽意思以為會很難,也沒有再認真去看,結束後發現是一個很簡單的前綴和問題,我和隊友都後悔不已啊。
解題思路:對所給的一組樣例解釋一下就明白怎麽使用的前綴和了,男主受到的所有傷害值為:
ans[n]是前n項的和,
(ans[4]-ans[1])+(ans[6]-ans[4])*2+(ans[10]-ans[8])*1+ans[10]
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 int main() 5 { 6 int n,m,sum,i,a,r,t; 7 int h[100010]; 8 int ans[100010]; 9 while(scanf("%d%d",&n,&m)!=EOF) 10 { 11 sum=0; 12 for(i=1; i<=n; i++) 13 { 14 scanf("%d",&h[i]); 15 } 16 for(i=1; i<=n; i++) 17 { 18 ans[i]=ans[i-1]+h[i];///前綴和 19 } 20 while(m--) 21 { 22 scanf("%d%d%d",&a,&r,&t); 23 sum=sum+(ans[a]-ans[r-1])*t; 24 } 25 sum=sum+ans[n]; 26 printf("%d\n",sum); 27 } 28 return 0; 29 }
從零開始的異世界生活(前綴和)