[NOIP2011]铺地毯

题目描述

为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有 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;
}
原文地址:https://www.cnblogs.com/Chen574118090/p/11550796.html