目录
思路:
首先,在看到这道题时,最直观的想法就是开一个二维数组,每次遍历一张地毯,并更新二
维数组。
但是,细心的读者肯定发现,这道题 a,b,g,k的最大值小于10^5。也就是说,二维数组的
x,y的最大值为 2*10^5 ,二维数组的大小就是 4*10^10 ,喜提MLE。
我们不妨换一个思路,先将 a,b,g,k 储存起来,最后在一个个遍历。如果 x,y 在这个地
毯范围內,更新答案。最后在输出答案。
经过计算,代码的时间复杂度是O(n),最坏遍历次数约为为10^4,不会 TLE,空间复杂度
为O(n),空间为10^4,不会 MLE。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+9; //定义常量maxn为数组大小
int a[maxn],b[maxn],c[maxn],d[maxn]; //储存a,b,g,k
int main(){
//定义n(地毯个数),x,y(位置),ans(储存答案,定义为-1,默认无地毯覆盖(x,y))
int n,x,y,ans=-1;
cin>>n; //输入地毯个数
for(int i=1;i<=n;i++){ //循环
//输入地毯左下角位置和地毯在x轴和y轴方向的长度并存储
cin>>a[i]>>b[i]>>c[i]>>d[i];
}
cin>>x>>y; //输入查询位置
for(int i=1;i<=n;i++){ //遍历所有地毯
//定义地毯x最大值和y最大值(左下角位置加上x轴或y轴方向的长度即可得)
int maxx=a[i]+c[i],maxy=b[i]+d[i];
if(x>=a[i]&&x<=maxx&&y>=b[i]&&y<=maxy){ //判断是否在区间内
ans=i; //更新答案
}
}
cout<<ans; //输出答案(如果无地毯覆盖则输出-1)
return 0;
}
附:这是我第一次写题解,如果有缺点,可以在评论区指出来,谢谢!