Colorful Field 题解

无耻地宣扬一下我的博客

1. 题意

有一个 \(n \times m\) 的矩阵,有 \(k\) 个点坏掉了不能种东西,其余的点按照从上往下,从左往右的顺序依次填入胡萝卜、奇异果和葡萄。有 \(t\) 次询问,每次询问输入一个坐标,输出这个坐标上种的是什么。

2.思路

我们可以把二维的矩阵拆成一维的一条线,同时将坏掉了的点按照它在这条线中的坐标排序,询问时通过二分查找这个点前面离它最近的坏掉了的点,而这个点在坏节点中的编号就是询问的点前面坏接点的数量。知道了前面有几个坏节点,其余的就可以用周期问题的思想愉快的解决了!

3.代码实现

#include <bits/stdc++.h>
using namespace std;
int n, m, k, t, bad[1001];
int main()
{
	scanf("%d%d%d%d", &n, &m, &k, &t);
	for (int i = 1; i <= k; i ++)
	{
		int x, y;
		scanf("%d%d", &x, &y);
		bad[i] = (x - 1) * m + y;
	}
	sort(bad + 1, bad + k + 1);
	while (t --)
	{
		int x, y, id, l, r, cnt;
		bool waste = false;
		scanf("%d%d", &x, &y);
		id = (x - 1) * m + y;
		l = 0, r = k;
		while (l <= r)
		{
			int mid = (l + r) >> 1;
			if (bad[mid] == id)
			{
				waste = true;
				break;
			}
			if (bad[mid] > id) r = mid - 1;
			else
			{
				l = mid + 1;
				cnt = mid;
			}
		}
		id -= cnt;
		if (waste) printf("Waste\n");
		else if (id % 3 == 0) printf("Grapes\n");
		else if (id % 3 == 1) printf("Carrots\n");
		else printf("Kiwis\n"); 
	}
}
posted @ 2023-02-14 17:22  Fislett  阅读(38)  评论(0)    收藏  举报