AcWing 5199. 现代艺术

AcWing 5199. 现代艺术

5199. 现代艺术 - AcWing题库

给定一个$M$行$N$列的方格矩阵,行从上到下依次编号为$1 \sim M$,列从左到右依次编号为$1 \sim N$。

初始时,所有方格都是黑色的。

一个艺术家将对矩阵依次进行$K$次涂鸦操作,操作分为以下两种:

  • R i,表示将第$i$行的所有方格改变颜色;
  • C j,表示将第$j$列的所有方格改变颜色。

变色规则:黑色方格改变颜色会变成金色方格,金色方格改变颜色会变成黑色方格。

请你计算在所有操作完成以后,矩阵中有多少金色方格。

输入格式

第一行包含整数$M$。

第二行包含整数$N$。

第三行包含整数$K$。

接下来$K$行,每行包含一个操作指令,格式如题面描述。

输出格式

一个整数,表示金色方格的数量。

数据范围

输入样例1:

1
2
3
4
5
3
3
2
R 1
C 1

输出样例1:

1
4

样例1解释:

第一次操作,将第一行所有方格改变颜色,矩阵变为:

1
2
3
金金金
黑黑黑
黑黑黑

第二次操作,将第一列所有方格改变颜色,矩阵变为:

1
2
3
黑金金
金黑黑
金黑黑

一共有$4$个金色方格。

输入样例2:

1
2
3
4
5
6
7
8
9
10
4
5
7
R 3
C 1
C 2
R 2
R 2
C 1
R 4

输出样例2:

1
10

样例2解释:

所有操作完成以后,最终得到矩阵:

1
2
3
4
黑金黑黑黑
黑金黑黑黑
金黑金金金
金黑金金金

一共有$10$个金色方格。

题解

我的题解

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
#include <iostream>
using namespace std;

const int N = 5000010;
int n, m, k;
// r[i]存储第i行是否被翻转过
// c[i]存储第i列是否被翻转过
bool r[N], c[N];

int main()
{
cin >> n >> m >> k;
for (int i = 0; i < k; i ++)
{
char op;
int num;
cin >> op >> num;
if (op == 'R')
r[num] = !r[num];
else if (op == 'C')
c[num] = !c[num];
}

int res = 0;
// 直接暴力遍历整个矩阵
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
if (r[i] != c[j])
res ++;
cout << res << endl;
return 0;
}

由于最近在学Python语法,所以Python版本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if __name__ == '__main__':
n = int(input())
m = int(input())
k = int(input())
r = [0 for _ in range(n + 1)]
c = [0 for _ in range(m + 1)]
for i in range(k):
opnum = list(map(str, input().split(' ')))
op = opnum[0]
num = int(opnum[1])
if op == 'R':
r[num] += 1
elif op == 'C':
c[num] += 1

res = 0
for i in range(1, n + 1):
for j in range(1, m + 1):
if (r[i] + c[j]) & 1:
res += 1
print(res)

y总题解

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
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 5000010;

int n, m, k;
int r[N], c[N];

int main()
{
scanf("%d%d%d", &n, &m, &k);
while (k -- )
{
char op[2];
int x;
scanf("%s%d", op, &x);
if (*op == 'R') r[x] ++ ;
else c[x] ++ ;
}

int res = 0;
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= m; j ++ )
if ((r[i] + c[j]) % 2)
res ++ ;

printf("%d\n", res);
return 0;
}