Description

在平面上堆叠着若干矩形,这些矩形的四边与平面X坐标轴或Y坐标轴平行。下图展示了其中一种情况,3个矩形的边将平面划分成8个区域:



下面展示了另一种稍稍复杂一些的情况:



你的任务是写一个程序,判断这些矩形将平面分成了几个区域。

Input

输入的第一行是一个正整数n(n<=50),分别矩形的数目,接下来的n行,每行有4个用空格分隔的整数li,ti,ri,bi(1<=i<=n)代表了第i个矩形的坐标,(li,ti)代表该矩形左上角的X坐标和Y坐标,(ri,bi)代表该矩形右下角的X坐标和Y坐标,0<=li<ri<=\(10^{6}\),0<=bi<ti<=\(10^{6}\))

Output

输出只有一个整数,代表这些矩形将平面划分成多少区域。

Solution

这道题有两个做法。

首先先将横坐标纵坐标离散化。

第一个做法:

用并查集,将相连的块连接起来,最后查有多少个块

第二个做法:

将边打上标记,将没被打标记的点进行扩散,统计块数

(作者用的是第一个做法)

Code

  1. #include <cstdio>
  2. #include <algorithm>
  3. #define open(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
  4. using namespace std;
  5. int i,p,last,fa[500001],n,j,heng,shu,l,r,ans,u,v,bj[500001];
  6. bool bz[1001][1001];
  7. struct re{
  8. int x1,x2,y1,y2;
  9. }a[51];
  10. struct node{
  11. int a,pl;
  12. }k[100001];
  13. const int d[5][2]={{0,0},{-1,0},{1,0},{0,1},{0,-1}};
  14. bool cmp(node x,node y){return x.a<y.a;}
  15. bool rec(node x,node y){return (x.pl<y.pl)||(x.pl==y.pl && x.a<y.a);}
  16. int gf(int x)
  17. {
  18. if (x==fa[x]) return x;
  19. fa[x]=gf(fa[x]);
  20. return fa[x];
  21. }
  22. void ls()
  23. {
  24. sort(k+1,k+2*n+1,cmp);
  25. p=0,last=0;
  26. for (i=1;i<=n+n;i++)
  27. {
  28. if (k[i].a==k[i-1].a) k[i-1].a=last;else
  29. {
  30. k[i-1].a=last;
  31. last=++p;
  32. }
  33. }
  34. k[n+n].a=last;
  35. sort(k+1,k+2*n+1,rec);
  36. }
  37. int main()
  38. {
  39. open("regions");
  40. scanf("%d",&n);
  41. for (i=1;i<=n;i++)
  42. {
  43. scanf("%d%d%d%d",&a[i].x1,&a[i].y1,&a[i].x2,&a[i].y2);
  44. k[i].a=a[i].x1;k[i+n].a=a[i].x2;
  45. k[i].pl=k[i+n].pl=i;
  46. }
  47. ls();
  48. heng=p*2;
  49. for (i=1;i<=n;i++)
  50. {
  51. a[i].x1=k[2*i-1].a*2;a[i].x2=k[2*i].a*2;
  52. }
  53. for (i=1;i<=n;i++)
  54. {
  55. k[i].a=a[i].y1;k[i+n].a=a[i].y2;
  56. k[i].pl=k[i+n].pl=i;
  57. }
  58. ls();
  59. shu=p*2;
  60. for (i=1;i<=n;i++)
  61. {
  62. a[i].y1=k[2*i-1].a*2;a[i].y2=k[2*i].a*2;
  63. }
  64. for (i=1;i<=n;i++)
  65. {
  66. l=a[i].x1;r=a[i].x2;
  67. for (j=a[i].y1;j<=a[i].y2;j++)
  68. bz[l][j]=bz[r][j]=1;
  69. l=a[i].y1;r=a[i].y2;
  70. for (j=a[i].x1;j<=a[i].x2;j++)
  71. bz[j][l]=bz[j][r]=1;
  72. }
  73. for (i=0;i<=heng;i++)
  74. {
  75. for (j=0;j<=shu;j++)
  76. fa[i*shu+j]=i*shu+j;
  77. }
  78. for (i=0;i<=heng;i++)
  79. {
  80. for (j=0;j<=shu;j++)
  81. {
  82. if (bz[i][j]) continue;
  83. for (l=1;l<=4;l++)
  84. {
  85. if (i+d[l][0]<=heng && i+d[l][0]>=0 && j+d[l][1]<=shu && j+d[l][1]>=0)
  86. {
  87. if (!bz[i+d[l][0]][j+d[l][1]])
  88. {
  89. u=gf(i*shu+j);
  90. v=gf((i+d[l][0])*shu+j+d[l][1]);
  91. if(fa[v]!=u) fa[u]=v;
  92. }
  93. }
  94. }
  95. }
  96. }
  97. for (i=0;i<=heng;i++)
  98. {
  99. for (j=0;j<=shu;j++)
  100. {
  101. if (bz[i][j]) continue;
  102. u=gf(i*shu+j);
  103. if (!i || !j || i==heng || j==shu)
  104. {
  105. if (!bj[u])bj[u]=2;
  106. if (bj[u]==1) bj[u]=2,ans--;
  107. }
  108. if (!bj[u])
  109. {
  110. bj[u]=1;
  111. ans++;
  112. }
  113. }
  114. }
  115. printf("%d",ans+1);
  116. return 0;
  117. }

jzoj 6798. 【2014广州市选day2】regions的更多相关文章

  1. jzoj 6797. 【2014广州市选day2】hanoi

    Description 你对经典的hanoi塔问题一定已经很熟悉了.有三根柱子,n个大小不一的圆盘,要求大盘不能压在小盘上,初始时n个圆盘都在第一根柱子上,最少要多少步才能挪到最后一根柱子上? 现在我 ...

  2. 【2014广州市选day1】JZOJ2020年9月12日提高B组T4 字符串距离

    [2014广州市选day1]JZOJ2020年9月12日提高B组T4 字符串距离 题目 Description 给出两个由小写字母组成的字符串 X 和Y ,我们需要算出两个字符串的距离,定义如下: 1 ...

  3. 【2014广州市选day1】JZOJ2020年9月12日提高B组T3 消除游戏

    [2014广州市选day1]JZOJ2020年9月12日提高B组T3 消除游戏 题目 Description 相信大家玩过很多网络上的消除类型的游戏,一般来说就是在一个大拼图内找出相同的部分进行最大程 ...

  4. 【2014广州市选day1】JZOJ2020年9月12日提高B组T2 导弹拦截

    [2014广州市选day1]JZOJ2020年9月12日提高B组T2 导弹拦截 题目 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统 V1.0.但是这种导弹拦截系统有一个缺 ...

  5. 【JZOJ3601】【广州市选2014】Tree(tree)

    ╰( ̄▽ ̄)╭ 每个非叶子节点,其左右子树叶子节点的权值之和相等.我们称这种二叉树叫平衡二叉树. 我们将一棵平衡二叉树叶子节点的权值从左到右列出来,假如这个权值序列是另一个序列A的子序列,我们称这棵平 ...

  6. SCOI 2014 省选总结

    总的来说作为高一党,去做省选难度的题完全就是去玩的,还是找惯例起身跪hja. 跪毕,看看自己惨不忍睹的成绩,我只想说:电子坑大为什么day1的暴力只有10分!为什么呢?我笑看题面: 方伯伯种玉米,方伯 ...

  7. NOIP 2014 提高组 Day2

    期望得分:100+60+30=190 实际得分:70+60+30=160 https://www.luogu.org/problem/lists?name=&orderitem=pid& ...

  8. JZOJ 1003【东莞市选2007】拦截导弹——dp

    题目:https://jzoj.net/senior/#main/show/1003 只要倒推一下第一次上升的最长和第一次下降的最长就行了.不用n^2logn,枚举了 j 还要用树状数组找值比自己大的 ...

  9. 2014 网选 上海赛区 hdu 5047 Sawtooth

    题意:求n个'M'型的折线将一个平面分成的最多的面数! 思路:我们都知道n条直线将一个平面分成的最多平面数是 An = An-1 + n+1 也就是f(n) = (n*n + n +2)/2 对于一个 ...

随机推荐

  1. Tensorflow Cpu不支持AVX

    Tensorflow从1.6开始从AVX编译二进制文件,所以如果你的CPU不支持AVX 你需要 从源码编译 下载旧版 从源码编译比较麻烦,如果你是初学的话,我建议使用旧版. 安装旧版: pip3 in ...

  2. offer收割机也有方法论

    秋招的战火就像这夏天的温度一样炙热,陆陆续续很多学弟学妹问我秋招的注意事项,作为温暖型大叔的我此刻必须出场了. 看仔细了,接下来龙叔就把这offer收割机的秘密都告诉你们. 如果你还没点关注的话,记得 ...

  3. 根据appid跳到App Store某个APP的详情页

    需求 本手机是否装了某个APP 示例百度appid 382201985  scheme BaiduSSO:// 1.是,直接打开百度APP 2.否,跳到App Store百度APP的详情页 NSStr ...

  4. Nginx进程模型

    多进程模式 在开始介绍Nginx的进程模型之前先说明下:Nginx也支持Single Master单进程模式,但是这个模式效率较低,一般只用在开发环境.所以不是本文介绍的重点. Nginx默认采用多进 ...

  5. SVG的引入历程

    直接引入编辑器会报错 Google: typescript svg cannot find module找到 这个网址 我放到了 shims-vue.d.ts 里面 declare module &q ...

  6. 产品经理培训教程视频大全与模板Axure rp9与8视频教程元件库模板

    注意:请仔细阅读购买,一旦发货百度网盘链接不能退~ 自动发邮件到买家留言处的邮箱,或注册淘宝时的邮箱自动通过旺旺给您发货还可以访问网页提取链接自助提取(复制到浏览器): http://4k5.cn/V ...

  7. 新手学习java路线

    关于新手学习java的路线 笔者也是根据这个路线学习的,希望对你们有所帮助. 首先你要确定你是学习java 并且能够踏踏实实的走下去.一定要多学习,我也可以一直陪你走下去的. 笔者一年工作经验,科班毕 ...

  8. Qt setMouseTracking使用

    Qt setMouseTracking使用(转载)   bool mouseTracking 这个属性保存的是窗口部件跟踪鼠标是否生效. 如果鼠标跟踪失效(默认),当鼠标被移动的时候只有在至少一个鼠标 ...

  9. Blazor带我重玩前端(五)

    概述 本文主要讨论Blazor事件内容,由于blazor事件部分很多,所以会分成上下两篇,本文为第一篇,后续会有第二篇. 我们可以视组件是一个类,我们先看一下前文所说的Index.Razor页面生成的 ...

  10. Elasticsearch7.6 集群部署、集群认证及使用、数据备份

    window 环境部署集群 注意:window下载解压elasticsearch一定需要解压多次.例如搭建的3节点的,需要解压3次,防止生成 cluster UUID 一致导致只能看到一个节点 1.e ...