倒数第一次操作是[1,2,1]
,即第2
列被修改为1
,那么第2
列的最后一次修改最终影响的元素数目是3 - 0 = 3
;此时,ans = ans + 1 * 3 = 3
;
倒数第二次操作是[0,2,3]
,即第2
行被修改为3
,那么第2
行的最后一次修改最终影响的元素数目是3 - 1 = 2
;此时,ans = ans + 3 * 2 = 9
;
倒数第三次操作是[1,0,1]
,即第0
列被修改为1
,那么第0
列的最后一次修改最终影响的元素数目是3 - 1 = 2
;此时,ans = ans + 1 * 2 = 11
;
倒数第四次操作是[0,1,2]
,即第1
行被修改为2
,那么第1
行的最后一次修改最终影响的元素数目是3 - 2 = 1
;此时,ans = ans + 2 * 1 = 13
;
倒数第五次操作是[0,0,4]
,即第0
行被修改为4
,那么第0
行的最后一次修改最终影响的元素数目是3 - 2 = 1
;此时,ans = ans + 4 * 1 = 17
。
所以,最终的答案是17
。
class Solution {
public:
using LL = long long;
LL matrixSumQueries(int n, vector<vector<int>>& queries) {
unordered_set<int> row_used, col_used;
LL ans = 0;
int type, index, val;
for (int i = queries.size() - 1; i >= 0; --i) {
const auto& query = queries[i];
type = query[0]; index = query[1]; val = query[2];
if (type == 0 && !row_used.count(index)) {
ans += val * (n - col_used.size());
row_used.insert(index);
} else if (type == 1 && !col_used.count(index)) {
ans += val * (n - row_used.size());
col_used.insert(index);
}
if (row_used.size() == n && col_used.size() == n) break;
}
return ans;
}
};
Python的做法
class Solution:
def matrixSumQueries(self, n: int, queries: List[List[int]]) -> int:
ans = 0
row_used = set()
col_used = set()
for type_, index, val in reversed(queries):
if type_ == 0 and index not in row_used:
row_used.add(index)
ans += val * (n - len(col_used))
elif type_ == 1 and index not in col_used:
col_used.add(index)
ans += val * (n - len(row_used))
if len(row_used) == n and len(col_used) == n:
break
return ans
超时的版本:
class Solution:
def matrixSumQueries(self, n: int, queries: List[List[int]]) -> int:
row_info = {}
col_info = {}
for t, (type_, index, val) in enumerate(queries):
if type_ == 0:
row_info[index] = (t, val)
else:
col_info[index] = (t, val)
ans = 0
for i in range(n):
for j in range(n):
rt, rval = row_info.get(i, (-1, 0))
ct, cval = col_info.get(j, (-1, 0))
val = rval if rt > ct else cval
ans += val
return ans