Logo FiraCode 的博客

博客

CF1196E

...
FiraCode
2025-12-01 12:55:23
什么意思呢

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2024-01-06 12:58:21

思路:

首先有一个性质,就是我们选中一个颜色后,在选另一个颜色,最多能解锁 $3$ 个当前颜色,证明很简单,首先最多是四个,然后若是 $4$ 的的话那么说明那个颜色与当前块不连通,所以至多三个。

由于矩形很大,于是可以考虑横着构造,若不够则在两边再选即可。

复杂度 $O(Tn)$。

Code:

#include <bits\/stdc++.h>

using namespace std;

int T;
int x, y;

int main() {
	scanf("%d", &T);

	while (T--) {
		scanf("%d%d", &x, &y);
		if (3 * x + 1 < y || 3 * y + 1 < x) puts("NO");
		else {
			puts("YES");
			if (x == y) {
				int X1 = 100000, Y1 = 100000;
				for (int i = 1; i <= y; ++i) {
					printf("%d %d\n", X1, Y1);
					printf("%d %d\n", X1, Y1 + 1);
					Y1 += 2;
				}
			} else if (x > y) {
				printf("%d %d\n", 100000, 100001);
				int X1 = 100000, Y1 = 100002;
				int tmp = max(0, x - y - 1);
				for (int i = 1; i <= y; ++i) {
					printf("%d %d\n", X1, Y1);
					printf("%d %d\n", X1, Y1 + 1);
					if (tmp) {
						printf("%d %d\n", X1 + 1, Y1);
						--tmp;
					}
					if (tmp) {
						printf("%d %d\n", X1 - 1, Y1);
						--tmp;
					}
					Y1 += 2;
				}
			} else {
				printf("%d %d\n", 100000, 100000);
				int X1 = 100000, Y1 = 100001;
				int tmp = max(0, y - x - 1);
				for (int i = 1; i <= x; ++i) {
					printf("%d %d\n", X1, Y1);
					printf("%d %d\n", X1, Y1 + 1);
					if (tmp) {
						printf("%d %d\n", X1 - 1, Y1);
						--tmp;
					}
					if (tmp) {
						printf("%d %d\n", X1 + 1, Y1);
						--tmp;
					}
					Y1 += 2;
				}
			}
		}
	}
	return 0;
}

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。