题目描述
为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有 nn 张地毯,编号从 11 到nn。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。
地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。
输入格式
输入共(n+2)行
第一行,一个整数nn,表示总共有nn张地毯
接下来的(n)行中,第(i+1)行表示编号ii的地毯的信息,包含四个正整数(a ,b ,g ,k),每两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的坐标((a,b))以及地毯在(x)轴和(y)轴方向的长度
第(n+2)行包含两个正整数(x)和(y),表示所求的地面的点的坐标((x,y))
输出格式
输出共1行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出(-1)
输入输出样例
输入
3
1 0 2 3
0 2 3 3
2 1 3 3
2 2
输出
3
数据范围
对于30% 的数据,有 (n ≤2) ;
对于50% 的数据,(0 ≤a, b, g, k≤1000);
对于100%的数据,有 (0 ≤n ≤10,000 ,0≤a, b, g, k ≤100,000)。
题解
简单题,记录每张地毯的左下角编号,先依次记录每张地毯左下角的坐标((x,y)),再枚举判断要求的坐标点((a,b))是否在地毯范围内,如果在则更新(ans)即可。
#include<bits/stdc++.h>
#define int long long
#define maxn 100005
#define local
using namespace std;
inline char get(){
static char buf[30000],*p1=buf,*p2=buf;
return p1==p2 && (p2=(p1=buf)+fread(buf,1,30000,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
register char c=get();register int f=1,_=0;
while(c>'9' || c<'0')f=(c=='-')?-1:1,c=get();
while(c<='9' && c>='0')_=(_<<3)+(_<<1)+(c^48),c=get();
return _*f;
}
int n;
struct edge{
int x,y,n,m;
}E[maxn];
signed main(){
#ifdef local
freopen("1.txt","r",stdin);
#endif
n=read();
for(register int i=1;i<=n;i++)E[i].x=read(),E[i].y=read(),E[i].n=read(),E[i].m=read();
int x=read(),y=read();
int ans=-1;
for(register int i=1;i<=n;i++){
if(E[i].x<=x && E[i].x+E[i].n>=x && E[i].y<=y && E[i].y+E[i].m>=y)ans=i;
}
cout<<ans<<endl;
return 0;
}