#18461: 還是TLE


gngn15401@gmail.com (冰箱)

學校 : 不指定學校
編號 : 98199
來源 : [123.194.13.42]
最後登入時間 :
2021-08-25 01:43:08
a694. 吞食天地二 | From: [111.246.106.23] | 發表日期 : 2019-07-15 11:06

#include <iostream>
using namespace std;
int main(){
int n,m;
while (cin >>n >>m && n!=EOF && m!=EOF){
int a[n][n];
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
cin >>a[i][j];
}
}
for (int i=0;i<m;i++){
int x1,x2,y1,y2,sum=0;
cin >>x1 >>y1 >>x2 >>y2;
for (int j=x1;j<=x2;j++){
for (int k=y1;k<=y2;k++){
sum+=a[j-1][k-1];
}
}
cout <<sum <<endl;
}
}
return 0;
}

 
#18462: Re:還是TLE


rexwu1104@gmail.com (黑雪公主 Black Lotus)

學校 : 新北市私立南山高級中學
編號 : 93041
來源 : [118.166.54.130]
最後登入時間 :
2022-06-06 20:48:09
a694. 吞食天地二 | From: [220.141.83.105] | 發表日期 : 2019-07-15 11:31

#include
using namespace std;
int main(){
int n,m;
while (cin >>n >>m){
int a[n][n];
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
cin >>a[i][j];
}
}
for (int i=0;i<m;i++){
int x1,x2,y1,y2,sum=0;
cin >>x1 >>y1 >>x2 >>y2;
for (int j=x1;j<=x2;j++){
for (int k=y1;k<=y2;k++){
sum+=a[j-1][k-1];
}
}
cout < }
}
return 0;
}

cin 改 scanf 看看


 
#18466: Re:還是TLE


inversion (「我們所認識的可符香是個像天使的好女孩」之葉林 *Cries...)

學校 : 國立清華大學
編號 : 43537
來源 : [49.159.6.107]
最後登入時間 :
2022-05-28 19:29:12
a694. 吞食天地二 | From: [49.158.83.43] | 發表日期 : 2019-07-15 16:30

#include
using namespace std;
int main(){
int n,m;
while (cin >>n >>m){
int a[n][n];
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
cin >>a[i][j];
}
}
for (int i=0;i<m;i++){
int x1,x2,y1,y2,sum=0;
cin >>x1 >>y1 >>x2 >>y2;
for (int j=x1;j<=x2;j++){
for (int k=y1;k<=y2;k++){
sum+=a[j-1][k-1];
}
}
cout < }
}
return 0;
}

cin 改 scanf 看看


誠如 asnewchien@gmail.com(david) 大大在樓主上一篇發問所說:「不是IO優化皆能治百病。」

 

我們可以觀察出來這個程式就是單純地每有一筆輸入,就運算一次所求矩形區域之數字和。最大 100000 筆輸入,每筆最大求整塊方陣的總和,且方陣最大有 500 × 500 個數字。

所以最多會有 100000 × 500 × 500 = 2.5 × 1010 以上的加法運算。輸出入優化的再怎麼快,也無法彌補大量運算的耗時。

 

因此,樓主應該做的是想一個可以降低計算量的方法。(不要一直重複計算已經算過的東西)

 

以上。希望有釐清樓主的疑慮。

 

 

 
#18551: Re:還是TLE


gngn15401@gmail.com (冰箱)

學校 : 不指定學校
編號 : 98199
來源 : [123.194.13.42]
最後登入時間 :
2021-08-25 01:43:08
a694. 吞食天地二 | From: [122.118.102.65] | 發表日期 : 2019-07-21 12:03

#include
using namespace std;
int main(){
int n,m;
while (cin >>n >>m){
int a[n][n];
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
cin >>a[i][j];
}
}
for (int i=0;i<m;i++){
int x1,x2,y1,y2,sum=0;
cin >>x1 >>y1 >>x2 >>y2;
for (int j=x1;j<=x2;j++){
for (int k=y1;k<=y2;k++){
sum+=a[j-1][k-1];
}
}
cout < }
}
return 0;
}

cin 改 scanf 看看


誠如 asnewchien@gmail.com(david) 大大在樓主上一篇發問所說:「不是IO優化皆能治百病。」

 

我們可以觀察出來這個程式就是單純地每有一筆輸入,就運算一次所求矩形區域之數字和。最大 100000 筆輸入,每筆最大求整塊方陣的總和,且方陣最大有 500 × 500 個數字。

所以最多會有 100000 × 500 × 500 = 2.5 × 1010 以上的加法運算。輸出入優化的再怎麼快,也無法彌補大量運算的耗時。

 

因此,樓主應該做的是想一個可以降低計算量的方法。(不要一直重複計算已經算過的東西)

 

以上。希望有釐清樓主的疑慮。

 

 

謝謝你們的建議,我會再思考


 
ZeroJudge Forum