Comet OJ - 2019六一欢乐赛 F.皮皮和月亮石!

题目描述

在上一话中,小智最终挑战成功,他得到了参加宝可梦联盟大赛的资格之一:灰色徽章,加上立志成为世界第一宝可梦饲育家的小刚,一行人继续着旅行。

然后,他们旅行到了月见山,要到达他们下一个目的地——华篮市,这条路是最快的捷径。他们来到一个山洞,在洞口遇到了一位名叫尼可的博士,他正在研究月亮石和宝可梦的来历,他相信宝可梦和月亮石都来自宇宙,他想探索宝可梦的奥秘。他们在另一个山洞里发现了很多皮皮,皮皮是一种妖精宝可梦,爱好和平,心地善良,她们守护着山洞里的月亮石,搬运宝石来为月亮石提供能量,然后等待月亮石发光,来提升自己的能力。

火箭队两人和他们的宝可梦猫猫也出现在了山洞里,他们为了抢走月亮石而不择手段,小智和小刚纷纷派出自己的宝可梦和他们战斗,并且在最后帮皮皮们夺回了月亮石。

尼可博士经历了这一次月亮石被抢的事情,决定要和皮皮们生活在一起,她们的幸福就是他的幸福。而小智一行人则继续旅行……

而尼可博士则开始在山洞附近的土地种树,他想让这里变成一片森林,保护更多的宝可梦。这里的土地由于经常会有宝可梦行走,会发生一些变化…

现在假设有 n \times mn×m 格土地,请想像土地有虚拟的格子线,一若有某个大小为 2 \times 22×2 格子都还能用,那么就可以在这2 \times 22×2 的格子上种一棵树。刚开始时每个格子都可以种树,接着有 qq 次变化,每次变化会多出一格土地不能用,请问在每次变化后都还剩多少种不同的位置可以种树。对于两种种树方式,只要左上角的格子座标不同就算不同。

输入描述

输入第一行有三個正整数 n, m, qn,m,q。(2\le n,m \le 10^3 , 1\le q \le 10^52≤n,m≤10
3
,1≤q≤10
5
)

我们把格子上面数来第 xx 行,左边数来第 yy 列的格子座标定为 (x,y)(x,y)。

接着有 qq 行,每行代表一次变化,包含兩個正整数 x, yx,y,代表该次变化是格子 (x,y)(x,y) 不能使用。(1\le x \le n,1 \le y \le m1≤x≤n,1≤y≤m,每次变化的格子 (x,y)(x,y) 都不一样)

输出描述

每次变化都输出 11 行包含一个整数,该数字代表现在还有多少种位置可以种树。

样例输入 1

3 4 4
2 4
3 3
1 1
2 2
样例输出 1

4
3
2
0
提示

样例解释:

对于第一次变化格子 (2,4)(2,4) 不能用后,能种树的位置的左上角可能座标为:(1,1),(1,2),(2,1),(2,2)(1,1),(1,2),(2,1),(2,2)。

对于第二次变化格子 (3,3)(3,3) 不能用后,能种树的位置的左上角可能座标为:(1,1),(1,2),(2,1)(1,1),(1,2),(2,1)。

对于第一次变化格子 (1,1)(1,1) 不能用后,能种树的位置的左上角可能座标为:(1,2),(2,1)(1,2),(2,1)。

对于第一次变化格子 (2,4)(2,4) 不能用后,已没有能种树的位置了。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<string>
#define ll long long
#define dd double
using namespace std;

ll a[1005][1005];

int main() {
	ll n, m, k;
	while (cin >> n >> m >> k) {
		ll x, y;
		memset(a, 0, sizeof(a));
		for (ll i = 0; i < n; i++) {
			a[i][m - 1] = 1;
		}
		for (ll i = 0; i < m; i++) {
			a[n - 1][i] = 1;
		}
		ll sum = (n - 1) * (m - 1);
		for (ll q = 0; q < k; q++) {
			cin >> x >> y;
			x--;
			y--;
			if (x == 0) {
				if (y == 0) {
					if (a[x][y] == 0) {
						sum--;
						a[x][y] = 1;
					}
				}
				else {
					if (a[x][y] == 0) {
						a[x][y] = 1;
						sum--;
					}
					if (a[x][y - 1] == 0) {
						sum--;
						a[x][y - 1] = 1;
					}
				}
			}
			if (y == 0) {
				if (x == 0) {
					if (a[x][y] == 0) {
						sum--;
						a[x][y] = 1;
					}
				}
				else {
					if (a[x][y] == 0) {
						a[x][y] = 1;
						sum--;
					}
					if (a[x - 1][y] == 0) {
						sum--;
						a[x - 1][y] = 1;
					}
				}
			}
			if (x != 0 && y != 0) {
				if (a[x][y] == 0) {
					sum--;
					a[x][y] = 1;
				}
				if (a[x][y - 1] == 0) {
					sum--;
					a[x][y - 1] = 1;
				}
				if (a[x - 1][y] == 0) {
					sum--;
					a[x - 1][y] = 1;
				}
				if (a[x - 1][y - 1] == 0) {
					sum--;
					a[x - 1] [y - 1] = 1;
				}
			}
			cout << sum << endl;
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值