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");
}
}

浙公网安备 33010602011771号