题目描述:
给你一个整数 n
和一个下标从 0 开始的 二维数组 queries
,其中 queries[i] = [typei, indexi, vali]
。
一开始,给你一个下标从 0 开始的 n x n
矩阵,所有元素均为 0
。每一个查询,你需要执行以下操作之一:
- 如果
typei == 0
,将第 indexi
行的元素全部修改为 vali
,覆盖任何之前的值。 - 如果
typei == 1
,将第 indexi
列的元素全部修改为 vali
,覆盖任何之前的值。
请你执行完所有查询以后,返回矩阵中所有整数的和。
数据范围:
$1\le n \le 10^4, 1\le queries.len \le 5 \times 10^4$
题解:
后面的后覆盖前面的,跟贴海报一样,可以直接倒序遍历,然后前面的只修改空白区域的。
如果对 $indexi$ 全修改,那么以后都不能对 $indexi$ 修改了,而且列空白格子数都要减一。可以发现列空白格子数与有几行涂满了有关。
同理,行空白格子数与列有几列涂满了有关。因此可以直接使用 $set$ 维护有哪些列,哪些行涂满了。
同时需要注意,如果之前出现过,那么前面的就不能再涂了。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| auto optimize_cpp_stdio = []() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); std::cout.tie(nullptr); return 0; }(); class Solution { public: const static int maxn = 1e5 + 10; const static int maxm = 1e5 + 10; const int INF = 0x3f3f3f3f; long long matrixSumQueries(int n, vector<vector<int>> &queries) { unordered_set<int> row, col; long long sum = 0; for (int q = queries.size() - 1; q >= 0; q--) { auto &query = queries[q]; int type = query[0], index = query[1], val = query[2]; if (type == 0) { if(row.count(index)) continue; sum += 1ll * (n - col.size()) * val; row.insert(index); } else { if(col.count(index)) continue; sum += 1ll * (n - row.size()) * val; col.insert(index); } } return sum; } };
|