[NOIP2011]铺地毯

mac2022-06-30  92

题目描述

为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有 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

相关资源:Konva基础文档
最新回复(0)