#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;
}
請高手們幫忙 謝謝
#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}$了!