题目
问题背景:
爆发于武汉的新型冠状病毒感染的肺炎疫情牵动着全国各地人民的心,一方有难,八方支援。截至目前,山东寿光向武汉捐赠蔬菜已达1120吨;俄罗斯中国总商会组织在俄企业、华人华侨捐赠各类防护用品约15吨;直升机空降新华路体育场,解武汉协和医院燃眉之急……大批捐赠物资的管理存放是个大问题。一旦处理不好劳民伤财不说,还会寒了广大爱心人士的心。
问题描述:
现在有一块边长为n的正方形空场地用来存放物资,场地被分割成一个个边长为1的方形小区域。一共有m批物资需要存放,编号为1—m,工作人员按编号顺序依次存放这m批物资,每一批物资需要选定一个矩形区域存放。若选定的矩形区域中,某个方形小区域已经有物资,则将本批物资摞到该方形小区域的最上面。你的任务是查询某个方形小区域最上面的物资属于第几批,若无物资输出0。
注:本题时间限制1s,空间限制256MB(此处最后面有解释与提示)
俯视图:
输入描述:
第1行2个整数n和m
接下来m行,每行四个整数x1,y1,x2,y2,分别表示这批物资选定的矩形区域的左上角是第x1行y1列,右下角是第x2行y2列
接下来1行2个整数x和y,表示要查询的方形小区域是第x行y列
输出描述:
1个整数
样例输入:
10 5
1 1 3 3
4 3 6 8
8 9 10 10
4 4 5 5
2 4 7 4
5 4
样例输出:
5
数据范围:
范围一:1<=n,m,x1,y1,x2,y2<=1000
范围二:1<=n,m,x1,y1,x2,y2<=1000000
解释与提示:
一、时间限制1s:竞赛中粗略认为1s可支撑1亿次运算。
1、for(i=1;i<=10;++i) a++; 该代码可以粗略的认为进行了10次运算
2、for(i=1;i<=1000000;++i)
for(j=1;j<=10000000;++j)
a[i][j]++; 该代码可以粗略的认为进行了1万亿次运算
二、空间限制256MB:此处只粗略计算数组大小。1个int型变量是4B,那么1个10001000的二维数组所占空间:100010004/1024/1024=3.81MB。1个10000001000000的二维数组所占空间:3814697.27MB
分析
第一次看到这种题的时候,我就是用解释2里的方法来做的,因为时间和空间限制,所以总是过不了。因此,我们不需要知道所有坐标所代表的数值是多少,我们只要知道,从最上面的物资开始搜索,我们输入的x,y是否在物资所在的范围内。
代码
#include<iostream>
#include<cstdio>
using namespace std;
int a[1001],b[1001],c[1001],d[1001];
int main()
{
int n,m,i;
int x,y;
cin>>n>>m;
for(i=1;i<=m;i++)
{
cin>>a[i]>>b[i]>>c[i]>>d[i];
}
cin>>x>>y;
for(i=m;i>=1;i--)
{
if((x>=a[i]&&x<=c[i])&&(y>=b[i]&&y<=d[i]))
{
break;
}
}
cout<<i<<endl;
return 0;
}
结果
一定要注意时间限制和空间限制。