#29966: 請各路高手幫忙 不會解決TLE


duke22909@gmail.com (hanchen chang)

學校 : 不指定學校
編號 : 119479
來源 : [123.194.181.101]
最後登入時間 :
2022-04-21 22:39:31
a693. 吞食天地 | From: [123.194.181.101] | 發表日期 : 2022-04-16 23:26

#include <iostream>

 

int main()

{

int n, m;

while(std::cin >> n >> m)

{

//std::cin >> m;

int food[n], sum, l, r;

for(int forward = 0; forward< n; forward++)

{

std::cin >> food[forward];

}

for(int situation = 1; situation<= m; situation++)

{

std::cin >> l >> r;

sum = 0;

for(int start = l; start<= r; start++)

{

//sum+= food[start - 1];

sum = sum + food[start - 1];

}

std::cout << sum << "\n"; 

}

 

}

return 0;

}

請高手們幫忙  謝謝

 
#29968: Re:請各路高手幫忙 不會解決TLE


ccpclub (ccpclub)

學校 : 不指定學校
編號 : 181202
來源 : [140.122.136.180]
最後登入時間 :
2024-05-03 16:04:45
a693. 吞食天地 | From: [1.34.88.173] | 發表日期 : 2022-04-17 09:56

#include

 

int main()

{

int n, m;

while(std::cin >> n >> m)

{

//std::cin >> m;

int food[n], sum, l, r;

for(int forward = 0; forward< n; forward++)

{

std::cin >> food[forward];

}

for(int situation = 1; situation<= m; situation++)

{

std::cin >> l >> r;

sum = 0;

for(int start = l; start<= r; start++)

{

//sum+= food[start - 1];

sum = sum + food[start - 1];

}

std::cout << sum << "\n"; 

}

 

}

return 0;

}

請高手們幫忙  謝謝

因為這種方式太慢了,我猜你的方法是對於每個查詢直接加,這樣時間複雜度為$\color{black}{O(NM)} $(你可以考慮一個最糟的狀況就是我查詢的L剛好在最左邊、R剛好最右邊,這樣一次查詢會$\color{black}{O(N)}$,而你要跑M次,會變$\color{black}{O(NM)}$ ,在這題$\color{black}{O(NM)}$為$\color{black}{10^{10}}$,所以一定會$\color{black}{TLE}$(C++大概$\color{black}{10^{8}}$是極限),你可以利用前綴和,建一個新陣列pre,$\color{black}{pre[1]=a_1}$、$\color{black}{pre[2]=a_1+a_2}$、...、$\color{black}{pre[n]=\sum_{i=1}^{n} a_i}$,先想出怎麼$\color{black}{O(N)}$跑出這個pre(提示:$\color{black}{pre[x]=a_x+pre[x-1]}$),接著每筆查詢的答案其實就是$\color{black}{pre[R]-pre[L-1]}$為$\color{black}{O(1)}$,M筆查詢加上建表總共$\color{black}{O(N+M)}$,就不會$\color{black}{TLE}$了!

 
ZeroJudge Forum