铺地毯

小灰灰 2023-06-26 08:13 103阅读 0赞

https://vijos.org/p/1736

描述

为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有n张地毯,编号从1到n。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。

格式

输入格式

输入共n+2行。

第一行,一个整数n(0 <= n <= 10,000),表示总共有n张地毯。

接下来的n行中,第i+1行表示编号i的地毯的信息,包含四个正整数a,b,g,k(0 <= a, b, g, k <= 100,000),每两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的坐标(a,b)以及地毯在x轴和y轴方向的长度。

第n+2行包含两个正整数x和y,表示所求的地面的点的坐标(x,y)。

输出格式

输出共1行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出-1。

样例1

样例输入1

  1. 3
  2. 1 0 2 3
  3. 0 2 3 3
  4. 2 1 3 3
  5. 2 2

Copy

样例输出1

  1. 3

Copy

样例2

样例输入2

  1. 3
  2. 1 0 2 3
  3. 0 2 3 3
  4. 2 1 3 3
  5. 4 5

Copy

样例输出2

  1. -1

Copy

限制

1s

来源

NOIp2011提高组Day1第一题

1s的时间大概时间限制在1亿次以内。256M空间如果是int类型的数组大概限制在256*1024*1024/4。

思路1,会超时。这里容易错的点是地毯右上角的坐标为(a+g,b+k).

可以将第一张地毯左下角和右上角(即地毯覆盖的范围)标记为1,第二张地毯覆盖的范围标记为2,以此类推,最后看(x,y)点的标记是几就可以了。

但是该程序的时间复杂度为O(n^3),超时了(n*(a+g)*(b+k))>1亿次,所以需要降低时间复杂度。

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. int map[10005][10005];//map[i][j]记录(i,j)点是第几章地毯,比如map[3][4]=2,表示(3,4)点属于第2张地毯
  5. int main()
  6. {
  7. int n,a,b,g,k,x,y;
  8. cin >> n;
  9. for(int p = 1; p <= n; ++p)
  10. {
  11. cin >> a >> b >> g >> k;
  12. for(int i = a; i <= a+g; ++i)
  13. {
  14. for(int j = b; j <= b+k; ++j)
  15. {
  16. map[i][j] = p;
  17. }
  18. }
  19. }
  20. cin >> x >> y;
  21. if(map[x][y] == 0) cout << "-1" << endl;
  22. else cout << map[x][y] << endl;
  23. return 0;
  24. }

思路2:只用记录每块地毯左下角和右上角的坐标,坐标用二维数组来标记,然后从n倒叙枚举,看点(x,y)是否在第n张地毯内,如果不在,就看是否在n-1张地毯内……

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. int map[10005][6];//map[i][j]记录第i张地毯的左下和右上角的4个坐标值
  5. int main()
  6. {
  7. int n;
  8. cin >> n;
  9. for(int i = 1; i <= n; ++i)
  10. {
  11. cin >> map[i][1] >> map[i][2] >> map[i][3] >> map[i][4];//a,b,g,k
  12. map[i][3] = map[i][3]+map[i][1];//右上角坐标
  13. map[i][4] = map[i][4]+map[i][2];
  14. }
  15. //int p = -1;
  16. int x,y;
  17. cin >> x >> y;
  18. for(int i = n; i >= 1; --i)//因为求最上面覆盖的地毯编号,所以要倒叙枚举
  19. {
  20. if(x >= map[i][1] && x <= map[i][3] && y >= map[i][2] && y <= map[i][4])//依次看(x,y)是否在n、n-1、n-2……1张地毯范围内
  21. {
  22. cout << i << endl;
  23. // p = 1;
  24. return 0;
  25. }
  26. }
  27. cout << "-1" << endl;
  28. return 0;
  29. }

发表评论

表情:
评论列表 (有 0 条评论,103人围观)

还没有评论,来说两句吧...

相关阅读

    相关 [NOIP2011]地毯

    题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有 nn 张地毯,编号从 11 到nn。现在将这

    相关 洛谷P1003 地毯

    哦,最近没给你们讲解洛谷题目是吧 俗话说,天下无一生下来就是天才的人,你以为我是天才吗?本大人也在刷题兮! 你们想讲什么题目? 还有…… 我新手村刷完了

    相关 地毯

    [https://vijos.org/p/1736][https_vijos.org_p_1736] 描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(

    相关 蓝桥杯:地毯

    为了准备一个学生节,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限铺上一些矩形地毯。一共有n 张地毯,编号从1 到n。现在将这些地毯按照编号从小到大的顺序平行于坐

    相关 洛谷P1003 地毯

    题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有 n 张地毯,编号从 1 到n 。现在将这些地

    相关 P1003 地毯

    题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有 nn 张地毯,编号从 11 到nn。现在将这

    相关 洛谷 P1003 地毯

    嗯.... 一道比较水的模拟题.. 刚拿到题的时候被它的数据范围吓到了,二维数组不可能开那么大啊,可是一边做发现测试数据太水 ... 先看

    相关 PCB

    问:为何要铺铜? 答:一般铺铜有几个方面原因。 1、EMC.对于大面积的地或电源铺铜,会起到屏蔽作用,有些特殊地,如PGND起到防护作用。 2、PCB工艺要求。一般