source:noip2016-rzz-1
給出兩個 n×n 的矩陣 a、b,矩陣每行每列標號 0~n-1 。
定義這兩個矩陣的乘積 ab 為
現在要在這兩個矩陣上依次進行 q 次修改操作,兩種操作描述如下:
在每一次修改操作進行後,輸出矩陣 ab(這兩個矩陣的乘積矩陣)中每個位置元素的權值之和。
第一行,乙個正整數 n ,表示矩陣的大小。
接下來 n 行,每行 n 個整數,描述矩陣 a 。
接下來 n 行,每行 n 個整數,描述矩陣 b 。
接下來一行,乙個正整數 q ,表示操作次數。
接下來 q 行,每行描述乙個操作,格式如題面所示。
輸出 q 行,每行乙個整數,表示這次操作完成後的答案。
21 2
3 4
4 3
2 1
3 a 1 1 2
b 0 1 3
a 0 0 10
40【資料規模與約定】40 103
對於 10% 的資料,n = 1。對於 30% 的資料,n,q≤10。對於 80% 的資料,1≤n≤100,|ai,j|,|bi,j|≤10。
對於 100% 的資料,1≤n≤1000,1≤q≤105,|aij|,|bi,j|≤1000。
矩陣乘法的答案矩陣中的$(i, j)$為:矩陣$1$的第$i$行中的每個數$(i, k)$,乘上矩陣$2$中第j列的每乙個數$(k, j)$
所以要求每次操作的答案,只需要記錄乙個$sum1[i]$表示矩陣$1$中第$i$列的和,和$sum2[i]$表示矩陣$2$中第$i$行的和,和$sum$表示答案矩陣的和。
修改矩陣$1$中的$(i, j)$時,$sum$只需加上$delta × sum2[i]$
修改矩陣$2$中的$(i, j)$時, $sum$只需加上$delta × sum1[j]$即可。
#include#includeview code#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long
ll;const
int n = 1005
;ll all, sum1[n], sum2[n];
inta[n][n], b[n][n];
intn, q;
inline
intre()
inline
void
wr(ll x)
intmain()
else
if(opt == 'b'
) wr(all), putchar('\n
');}
return0;
}
NOIP校內模擬 矩陣分組 matrix
很容易想到二分。我們二分什麼呢?二分極值 首先,a,b兩部分一定是逐行長度遞增 遞減 的圖形,才能滿足最多拐一次彎到達,而且a,b可以互換 其次,最大值和最小值肯定不能在乙個區域裡,這樣得出的答案肯定不是最優的,我們可以根據這個性質,找到check的方法 假設最大值在a這一部分,a覆蓋了左上角,我們...
Noip模擬題 Matrix 遞推,組合數
時間限制 1 sec 記憶體限制 512 mb 題目描述 小 z 的女朋友送給小 z 乙個 n n 的矩陣。但是矩陣實在太大了,小 z 的女朋友拿不動,只能帶給他兩個長度為 n 的整數序列 l,t 分別作為矩陣 f 的第一行和第一列 保證 l1 t1 並且告訴小 z 矩陣可以通過如下方式得到 fi,...
NOIP2014 比例簡化 模擬
輸入檔案 ratio.in輸出檔案 ratio.out簡單對比 時間限制 1 s 記憶體限制 256 mb 在社交 上,經常會看到針對某乙個觀點同意與否的民意調查以及結果。例如,對某一觀點表示支援的有1498人,反對的有902人,那麼贊同與反對的比例可以簡單的記為1498 902。不過,如果把調查結...