[SMOJ2100]打印机

xiaoxiao2021-02-28  105

最近很少做这么水的题了呢。

20%:模拟。时间复杂度 O(k×max(n,m))

40%:不知道有什么神奇的搞法。

100%:

很显然是对于二维平面的修改和查询,可以考虑写个二维线段树去维护整个矩阵,但是太暴力了,而且我也不会写。

现在来说正解。

考虑到每次染色是对于一整行或一整列进行的,不妨记第 i 行最后被染成的颜色为 rowi,被染时间为 rowti ,类似地,第 j 列最后被染成的颜色为 colj,被染时间为 coltj 。这样一来对于每一次染色操作只是更新这些信息就可以了。

于是在输出的时候,对于矩阵的第 i 行第 j 列,如果 rowti>coltj ,即它最后是被一行地染色,那么输出 rowi ,否则它最后是被一列地染色,输出 colj 。但要注意没有被两种方式都染过色的情况,特殊判断一下。

时间复杂度是 O(n×m) 的,主要耗在输出上面。

参考代码:

#include <algorithm> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> using namespace std; const int MAXN = 1e5 + 100; int n, m, k; int rowc[MAXN], colc[MAXN]; int rowt[MAXN], colt[MAXN]; int main(void) { freopen("2100.in", "r", stdin); freopen("2100.out", "w", stdout); scanf("%d%d%d", &n, &m, &k); memset(rowt, 0x7f, sizeof rowt); memset(colt, 0x7f, sizeof colt); for (int t = 0; t < k; t++) { int x, i, c; scanf("%d%d%d", &x, &i, &c); if (x == 1) { rowc[i] = c; rowt[i] = t; } if (x == 2) { colc[i] = c; colt[i] = t; } } for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) printf("%d ", (rowt[i] != 0x7f7f7f7f && rowt[i] > colt[j]) || colt[j] == 0x7f7f7f7f ? rowc[i] : colc[j]); putchar('\n'); } return 0; }

转载请注明原文地址: https://www.6miu.com/read-38954.html

最新回复(0)