
 
 
 
分析:
每次操作会把上一次的状态覆盖,但是从后往前操作可以保留最后一次覆盖,每一个位置最后的覆盖状态一定是最终状态,因此可以存下来从后往前记录第一次覆盖的状态并计数。
代码:
#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';
}

















