HDU 4920 居然會超時

2022-04-05 15:36:04 字數 1532 閱讀 9188

題意:求兩個n*n的矩陣相乘的結果,得出的每個元素%3;

分析:2000ms然後n的範圍是800,我們自己估算的時間複雜度並不會超時,但是結果就是超時了。

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 

8 #include 9 #include 10 #include

11 #include 12 #include 13 #include 14

using

namespace

std;

15#define ll long long

16#define _cle(m, a) memset(m, a, sizeof(m))

17#define repu(i, a, b) for(int i = a; i < b; i++)

18#define repd(i, a, b) for(int i = b; i >= a; i--)

19#define sfi(n) scanf("%d", &n)

20#define pfi(n) printf("%d\n", n)

21#define maxn 100010

22const

int n = 810;23

intn;

24int

a[n][n], b[n][n], c[n][n];

25int

scan()

2632 res = ch - '0'

;33while( ( ch = getchar() ) >= '

0' && ch <= '9'

)34 res = res * 10 + ( ch - '0'

) ;35

return

res ;36}

3738

intmain()

3947 repu(i,0

,n)48 repu(j,0

,n)49

52 memset(c, 0, sizeof

(c));

53 repu(i,0

,n)5463}

64}65for(int i = 0; i < n; i++)

6673 puts(""

);74}75

}76return0;

77 }

view code

我當時找稀疏矩陣的時候就找到的是直接矩陣相乘的模板,但是還是超時了,後來才知道我的輸入掛需要重新更新了。

不過我還有一點疑惑就是為什麼同樣是三層迴圈(i,j,k),但是跑出來的時間不一樣的呢。。。。。。。

c[i][j] += a[i][k] * b[k][j];///會超時

c[i][k] += a[i][j] * b[j][k];///不會超時

c[j][k] += a[j][i] * b[i][k];///不會超時

hdu4920(矩陣 乘法)

題意 矩陣乘法,在乘的過程中每個元素都取模3 在比賽時,我一直在想怎麼才能把o n n n 的時間複雜度給降下來,可是一直沒想到好的辦法,後來看了題解後才知道原來時間複雜度還是o n n n 只是優化了一點而已 如下 include include include include include i...

HDU4920 矩陣乘法

嗯嗯 就算是水題吧。縮完行就15行 題意 兩個n n的矩陣相乘 n 800 結果對3取模 思路 先對3取模,所以兩個矩陣裡面會出現很多0,所以可以先列舉乙個矩陣,只有當該位置不是0的時候才和另乙個矩陣做乘法。取模的時候也有技巧,不要在計算的途中取模,應該讀入的時候取一次模,輸出的時候取一次模 計算量...

bzoj4920 薄餅切割

傳送門 首先要發現其實木棍覆蓋區域是圓環形狀的。於是我們要求出大圓半徑r和小圓半徑r 首先大圓半徑顯然是在兩個端點處取到的。然後,發現點在木棍上移動是與圓心距離的函式是單峰函式。於是我們可以三分求最小值。然後問題九轉化成了圓形面積和長方形面積的交。分類要論以下就可以求出來了。include incl...