链接:https://ac.nowcoder.com/acm/problem/16593

为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有n张地毯,编号从1到n。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。

枚举优化思路:减少枚举次数——1.选择合适的枚举对象。2.选择合适的枚举方向。3.选择合适的数据维护方法;

题解:


using namespace std;

const int N = 1e4 + 10;
long long a[N], b[N], g[N], h[N];
int x, y;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n;
	cin >> n;
	int ans = -1;
	for (int i = 1; i <= n; i++) {
		cin >> a[i] >> b[i] >> g[i] >> h[i];
	}
	cin >> x >> y;
	for (int i = n; i >= 1; i--) {
		if (x >= a[i] && x <= a[i] + g[i] && y >= b[i] && y <= b[i] + h[i]) {
			ans = i;
			break;
		}
	}
	cout << ans << endl;
	return 0;
}

自己一开始想的是模拟方法,但是在这么大数据的情况下模拟显然是不行的。所以选择了这个枚举方法,将每个地毯先保存下来,我们要找的只是那个点最后所在的地毯,所以我们可以采用倒叙,只要找到那个点就输出所在地毯就可以了。