法1
朴素查找安全的个数
#include <bits/stdc++.h>
using namespace std;
int n, m, q;
int g[2][100005], cnt;
int main(){
cin >> n >> m >> q;
while(q--){
int t, c;
cin >> t >> c;
g[t][c] = 1; // 标记一下被攻击的情况
}
for(int i = 1; i <= n; i++)
if(g[0][i]) continue; // 行i被攻击
else
for(int j = 1; j <= m; j++)
if(g[1][j]) continue; // 列j被攻击
else cnt++;
cout << cnt;
return 0;
}
法2
数学计算 行和
列会产生
个重叠点
#include <bits/stdc++.h>
using namespace std;
int n, m, q;
set<int> st[2];
int main(){
cin >> n >> m >> q;
while(q--){
int t, c;
cin >> t >> c;
st[t].insert(c);
}
int x = st[0].size(), y = st[1].size();
cout << n*m - (x*m + y*n - x*y);
return 0;
}