方法1:浮漂法。

题目意思是,后来的覆盖在前面的上面。

我们可以倒过来, 从后往前。 这样后来的在上面,前面的,从下往上“浮“。

要点1: 2个矩形如何判断不相交?

一个矩形的最右边,在另外一个矩形最左边。  上下同理。   (程序实现的时候,因为不知道左右上下关系,所以要4个or来判断)

要点2:如何切割:

红色的在上面,白色的想上浮。 可以先让1的部分上浮。  上浮后, 矩形变小。(把上浮的地方切掉)

切割后,只有黑色的矩形这一块, 然后再让2的地方上浮。

要点3: 如何知道要切割的地方?

根据2个矩形的最左边,最右边的坐标关系。  如果【上面】的矩形,的最下面的y1坐标,在【下面】的矩形最上面的y2坐标的”下面“(y1<y2) 那么这一块就要切割(最好画图画一下)

Executing...Test 1: TEST OK [0.008 secs, 3424 KB]Test 2: TEST OK [0.011 secs, 3424 KB]Test 3: TEST OK [0.008 secs, 3424 KB]Test 4: TEST OK [0.005 secs, 3424 KB]Test 5: TEST OK [0.008 secs, 3424 KB]Test 6: TEST OK [0.008 secs, 3424 KB]Test 7: TEST OK [0.005 secs, 3424 KB]Test 8: TEST OK [0.003 secs, 3424 KB]Test 9: TEST OK [0.003 secs, 3424 KB]Test 10: TEST OK [0.003 secs, 3424 KB]Test 11: TEST OK [0.011 secs, 3424 KB]All tests OK.
/*
TASK:rect1
LANG:C++
*/
#include <iostream>
#include <cstdio>
using namespace std;int colo[2510]={1, 0};
int zx[2510]={0},zy[2510]={0},yx[2510],yy[2510];
int output[2510]={0};
int n;void init()
{int ax, ay;scanf("%d%d%d", &yx[0], &yy[0], &n);for (int i = 1; i <= n; ++ i)  scanf("%d%d%d%d%d", &zx[i], &zy[i], &yx[i], &yy[i], &colo[i]);
}void cover(int x1, int y1, int x2, int y2, int yanse, int deep)
{if (x1 >= x2 || y1 >= y2)  return;//矩形面积为0, 显然直接退出不用做任何计算 while (deep <= n && (yx[deep] <= x1 || x2 <= zx[deep] || y2 <= zy[deep] || yy[deep]<= y1)) ++ deep;//浮到第deep层,和第deep层的矩形进行比较,看是否有重叠地方。//2个矩形如果没有重叠,那么情况一定是// 一个矩形最右边,在另外一个矩形最左边的左边。  上下关系同理。 // 因为本身不知道2个矩形上下左右关系,所以分4个情况考虑,满足任何一个,就说明2个矩形没有重叠。// 如果浮到超过deep层,就结束了if (deep > n) //没有覆盖的{output[yanse] += (x2 - x1)*(y2 - y1);//当前颜色 += 当前面积return; }if (x1 <= zx[deep])  //分情况分割{cover(x1, y1, zx[deep], y2, yanse, deep + 1);x1 = zx[deep];}if (yx[deep] <= x2){cover(yx[deep], y1, x2, y2, yanse, deep + 1 );x2 = yx[deep];}if (y1 <= zy[deep]){cover(x1, y1, x2, zy[deep], yanse, deep + 1);y1 = zy[deep];} if (yy[deep] <= y2){cover(x1, yy[deep], x2, y2, yanse, deep + 1);  y2 = yy[deep];}
}void doit()
{for (int i = n; i >= 0; -- i)cover(zx[i],zy[i],yx[i],yy[i], colo[i],i + 1);  for (int i = 1; i <= 2500; ++ i)if (output[i])   printf("%d %d\n",i, output[i]);
}
int main()
{freopen("rect1.in","r",stdin);freopen("rect1.out","w",stdout);init();doit();return 0;
}

【USACO3.1.4】形成的区域 二维线段树/离散化/矩形切割/浮漂法 【线段树方法以后写】相关推荐

  1. php 二维数组字段合并,PHP将二维数组某一个字段相同的数组合并起来的方法,二维数组数组_PHP教程...

    PHP将二维数组某一个字段相同的数组合并起来的方法,二维数组数组 本文实例讲述了PHP将二维数组某一个字段相同的数组合并起来的方法.分享给大家供大家参考,具体如下: 例子: array(3) { [0 ...

  2. 二维教组A[12][18]采用列优先的存储方法,若每个元素各占3个存储单元,且第1个元素的地址为150,则元素A[9][7]的地址为 ( )

    二维教组A[12][18]采用列优先的存储方法,若每个元素各占3个存储单元,且第1个元素的地址为150,则元素A[9][7]的地址为 (   ) A.429 B.432 C.435 D.438 [分析 ...

  3. 二维前缀和(矩形割补法)——杨子曰算法

    二维前缀和(矩形割补法)--杨子曰算法 今天曰一个很实用的技巧,二维前缀和 来,先问一个问题,如果我给出一个矩阵,让你求出任意一个子矩阵的和,你会怎么搞? 哦,简单简单,O(n^2)咔咔地暴力一下,欧 ...

  4. 有限元方法入门:有限元方法简单的二维算例(矩形剖分)

    #有限元方法简单的二维算例(矩形剖分) 算例描述 我们对下述椭圆边值问题 \label{eq1}{−Δu=fu∣∂Ω=0\left \{ \begin{aligned} & -\Delta u ...

  5. 二维码彩色广告招牌的切割制作问题(C#.net下对彩色二维码圆角样式及改进)...

    原文:二维码彩色广告招牌的切割制作问题(C#.net下对彩色二维码圆角样式及改进) 我们知道,目前二维码还很少用于广告招牌的制作.但随着智能手机越来越普及,互联网等网络的应用也越来越广泛,作为连接物理 ...

  6. 【原创】去掉微信登录二维码中的微信登录几个字的解决方法

    去掉微信登录二维码中的微信登录几个字的解决方法 通过分析,原来微信自己有参数可以去掉, 解决方法,如下: 链接中加上 &popup=0&href=https%3A%2F%2Fsta.g ...

  7. 有限元-二维有限元编程(矩形区域、三角剖分)

    有限元-矩形区域三角剖分程序 本文将介绍矩形区域上Poisson方程−Δu=f,Δ=∂∂x2+∂∂y2-\Delta u=f,\Delta= \frac{\partial}{\partial x^2} ...

  8. 二维数组子数组矩形和

    在完成一维数组子数组和的最大值后,我们将目光转向了二维数组,如何求二维数组矩形子数组最大和呢? 最简单的办法:都算一遍! 是的,将所有可以构成矩形的子数组全算一遍,然后进行比较大小.这是最简单的.最麻 ...

  9. catia二维图坐标如何表示_CATIA二维工程制图中孔系尺寸及点坐标标注方法

    CATIA作为一款高端CAD软件,目前在航空.汽车等领域有着广泛的应用,但目前很多企业尤其是中小规模公司仍然仅将其作为三维建模工具使用,在编辑二维工程图时还要将其转换为AutoCAD格式操作,使CAT ...

最新文章

  1. NASA宣布发现 “第2个地球”
  2. kill进程_你还在使用kill -9 杀进程吗?从原理谈避免踩雷!
  3. 【渝粤题库】陕西师范大学202231财务管理Ⅰ 作业(高起专)
  4. web.config中配置字符串中特殊字符的处理
  5. conda指定路径_导出不带前缀变量的conda环境,该变量显示executab的本地路径
  6. 2014年最受欢迎WEB前端UI框架
  7. 30秒,2种方法解决SQL Server的内存管理问题
  8. 我的YUV播放器MFC小笔记:解析文件名称
  9. [转载] python的next()函数
  10. centos7自带流量监控软件iftop
  11. 机器学习与知识发现_01机器学习算法整体知识体系与学习路线攻略
  12. R大 关于 G1 算法原理的解释说明
  13. 收集了 1000 个 iOS 常用的库。原文:https://github.com/iamdaiyuan/ios_top_1000
  14. 10 系统建模语言SysML——参数图
  15. Lm317电压源芯片制作电流源
  16. 汇编语言||基本传送指令MOV的用法详解
  17. 如何编辑二维码内容并批量生成
  18. IDEA的Project与Structure依赖jar包的方式
  19. 谈谈Linux打补丁的原理以及如何判别打补丁的错误 --- 从补丁学内核
  20. Excel使用日历控件

热门文章

  1. 国内IT公司病种,需要合理协调,共同进步,才能不被嘈乱的世道所唾弃
  2. 面向鲲鹏和昇腾的创新架构
  3. 【入门AUTOSAR网络管理测试】NOS-RSS状态转换
  4. 【操作系统】死锁相关知识点
  5. Linux sort --将文本文件内容加以排序
  6. 谷粒商城-分布式事务
  7. 【Basic Algebra】群论学习整理
  8. 50Projects50Days--RotatingNavgation
  9. 【NOIP2014提高组】飞扬的小鸟
  10. HTML+CSS学习记录01--VScode编辑器安装与配置