#温馨提示:此文章使用的是MD编辑器,在小程序上查看可能会出现乱码,敬请谅解
【题目链接】P1003 [NOIP2011 提高组] 铺地毯
看到这题,我们可能会想到开一个二维数组,记录每个格子的状态,
但是数据范围是
0
≤
n
≤
1
0
4
0 \le n \le 10^4
0≤n≤104,会MLE。
既然这样,我们可以尝试用两个数组记录每张地毯的左下角和右上角,再从后向前看看输入的点在不在某个地毯里,如果是就输出并结束程序。
AC代码如下
// C++
#include<iostream>
using namespace std;
int a[10001][2], b[10001][2];// 定义二维数组a和b用于存储地毯的左下角坐标以及右上角坐标
int main()
{
int n,g,k;
cin>>n;
for (int j=1;j<=n;j++){
cin>>a[j][0]>>a[j][1]>>g>>k;
b[j][0]=a[j][0]+g;//计算地毯的右上角坐标
b[j][1]=a[j][1]+k;
}
int x,y;
cin>>x>>y;
for (int j=n;j>=1;j--){// 从后往前遍历地毯编号,检查所求点是否在地毯范围内
if (x >= a[j][0] && x <= b[j][0] && y >= a[j][1] && y <= b[j][1]){
cout<<j;
return 0;
}
}
cout<<-1;// 若没有地毯覆盖该点,则输出-1
return 0;
}