分析:
每次操作会把上一次的状态覆盖,但是从后往前操作可以保留最后一次覆盖,每一个位置最后的覆盖状态一定是最终状态,因此可以存下来从后往前记录第一次覆盖的状态并计数。
代码:
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m, q;
cin >> n >> m >> q;
int cntr = n, cntc = m;
ll ans = 0;
vector<int> r(n + 1, -1), c(m + 1, -1);
vector<int> id(q), x(q), op(q);
for(int i = 0; i < q; i ++) {
string a, c;
int b;
cin >> a >> b >> c;
if(a == "row") id[i] = 0;
else id[i] = 1;
x[i] = b;
if(c == "on") op[i] = 1;
else op[i] = 0;
}
for(int i = q - 1; i >= 0; i --) {
if(id[i] == 0) {
if(r[x[i]] != -1) continue;
ans += cntc * op[i];
r[x[i]] = op[i];
cntr --;
}
else {
if(c[x[i]] != -1) continue;
ans += cntr * op[i];
c[x[i]] = op[i];
cntc --;
}
}
cout << ans << '\n';
}