jzoj 6798. 【2014广州市选day2】regions
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
#include <cstdio>
#include <algorithm>
#define open(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
int i,p,last,fa[500001],n,j,heng,shu,l,r,ans,u,v,bj[500001];
bool bz[1001][1001];
struct re{
int x1,x2,y1,y2;
}a[51];
struct node{
int a,pl;
}k[100001];
const int d[5][2]={{0,0},{-1,0},{1,0},{0,1},{0,-1}};
bool cmp(node x,node y){return x.a<y.a;}
bool rec(node x,node y){return (x.pl<y.pl)||(x.pl==y.pl && x.a<y.a);}
int gf(int x)
{
if (x==fa[x]) return x;
fa[x]=gf(fa[x]);
return fa[x];
}
void ls()
{
sort(k+1,k+2*n+1,cmp);
p=0,last=0;
for (i=1;i<=n+n;i++)
{
if (k[i].a==k[i-1].a) k[i-1].a=last;else
{
k[i-1].a=last;
last=++p;
}
}
k[n+n].a=last;
sort(k+1,k+2*n+1,rec);
}
int main()
{
open("regions");
scanf("%d",&n);
for (i=1;i<=n;i++)
{
scanf("%d%d%d%d",&a[i].x1,&a[i].y1,&a[i].x2,&a[i].y2);
k[i].a=a[i].x1;k[i+n].a=a[i].x2;
k[i].pl=k[i+n].pl=i;
}
ls();
heng=p*2;
for (i=1;i<=n;i++)
{
a[i].x1=k[2*i-1].a*2;a[i].x2=k[2*i].a*2;
}
for (i=1;i<=n;i++)
{
k[i].a=a[i].y1;k[i+n].a=a[i].y2;
k[i].pl=k[i+n].pl=i;
}
ls();
shu=p*2;
for (i=1;i<=n;i++)
{
a[i].y1=k[2*i-1].a*2;a[i].y2=k[2*i].a*2;
}
for (i=1;i<=n;i++)
{
l=a[i].x1;r=a[i].x2;
for (j=a[i].y1;j<=a[i].y2;j++)
bz[l][j]=bz[r][j]=1;
l=a[i].y1;r=a[i].y2;
for (j=a[i].x1;j<=a[i].x2;j++)
bz[j][l]=bz[j][r]=1;
}
for (i=0;i<=heng;i++)
{
for (j=0;j<=shu;j++)
fa[i*shu+j]=i*shu+j;
}
for (i=0;i<=heng;i++)
{
for (j=0;j<=shu;j++)
{
if (bz[i][j]) continue;
for (l=1;l<=4;l++)
{
if (i+d[l][0]<=heng && i+d[l][0]>=0 && j+d[l][1]<=shu && j+d[l][1]>=0)
{
if (!bz[i+d[l][0]][j+d[l][1]])
{
u=gf(i*shu+j);
v=gf((i+d[l][0])*shu+j+d[l][1]);
if(fa[v]!=u) fa[u]=v;
}
}
}
}
}
for (i=0;i<=heng;i++)
{
for (j=0;j<=shu;j++)
{
if (bz[i][j]) continue;
u=gf(i*shu+j);
if (!i || !j || i==heng || j==shu)
{
if (!bj[u])bj[u]=2;
if (bj[u]==1) bj[u]=2,ans--;
}
if (!bj[u])
{
bj[u]=1;
ans++;
}
}
}
printf("%d",ans+1);
return 0;
}
jzoj 6798. 【2014广州市选day2】regions的更多相关文章
- jzoj 6797. 【2014广州市选day2】hanoi
Description 你对经典的hanoi塔问题一定已经很熟悉了.有三根柱子,n个大小不一的圆盘,要求大盘不能压在小盘上,初始时n个圆盘都在第一根柱子上,最少要多少步才能挪到最后一根柱子上? 现在我 ...
- 【2014广州市选day1】JZOJ2020年9月12日提高B组T4 字符串距离
[2014广州市选day1]JZOJ2020年9月12日提高B组T4 字符串距离 题目 Description 给出两个由小写字母组成的字符串 X 和Y ,我们需要算出两个字符串的距离,定义如下: 1 ...
- 【2014广州市选day1】JZOJ2020年9月12日提高B组T3 消除游戏
[2014广州市选day1]JZOJ2020年9月12日提高B组T3 消除游戏 题目 Description 相信大家玩过很多网络上的消除类型的游戏,一般来说就是在一个大拼图内找出相同的部分进行最大程 ...
- 【2014广州市选day1】JZOJ2020年9月12日提高B组T2 导弹拦截
[2014广州市选day1]JZOJ2020年9月12日提高B组T2 导弹拦截 题目 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统 V1.0.但是这种导弹拦截系统有一个缺 ...
- 【JZOJ3601】【广州市选2014】Tree(tree)
╰( ̄▽ ̄)╭ 每个非叶子节点,其左右子树叶子节点的权值之和相等.我们称这种二叉树叫平衡二叉树. 我们将一棵平衡二叉树叶子节点的权值从左到右列出来,假如这个权值序列是另一个序列A的子序列,我们称这棵平 ...
- SCOI 2014 省选总结
总的来说作为高一党,去做省选难度的题完全就是去玩的,还是找惯例起身跪hja. 跪毕,看看自己惨不忍睹的成绩,我只想说:电子坑大为什么day1的暴力只有10分!为什么呢?我笑看题面: 方伯伯种玉米,方伯 ...
- NOIP 2014 提高组 Day2
期望得分:100+60+30=190 实际得分:70+60+30=160 https://www.luogu.org/problem/lists?name=&orderitem=pid& ...
- JZOJ 1003【东莞市选2007】拦截导弹——dp
题目:https://jzoj.net/senior/#main/show/1003 只要倒推一下第一次上升的最长和第一次下降的最长就行了.不用n^2logn,枚举了 j 还要用树状数组找值比自己大的 ...
- 2014 网选 上海赛区 hdu 5047 Sawtooth
题意:求n个'M'型的折线将一个平面分成的最多的面数! 思路:我们都知道n条直线将一个平面分成的最多平面数是 An = An-1 + n+1 也就是f(n) = (n*n + n +2)/2 对于一个 ...
随机推荐
- GitHub上最火的SpringCloud微服务商城系统项目,附全套教程
项目介绍 mall-swarm是一套微服务商城系统,采用了 Spring Cloud Greenwich.Spring Boot 2.MyBatis.Docker.Elasticsearch等核心技术 ...
- C#LeetCode刷题之#122-买卖股票的最佳时机 II(Best Time to Buy and Sell Stock II)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4032 访问. 给定一个数组,它的第 i 个元素是一支给定股票第 ...
- 题解 BZOJ4709
题目描述 一道简单DP优化调了好久qwq 首先分析题目,发现每次从一边取贝壳是完全没用的,此题本质就是将区间分成数个区间,使区间价值和最大. 可以发现一个性质,那就是最优解的每个区间的两端点一定相同且 ...
- 使用Spring Boot开发者工具进行自动重启和页面自动刷新
简介 大家可能都听说过开发Node.js应用时可以使用多种工具对开发者提供便利,如WebPack提供了开发者服务器来支持js应用动态更替,并在保存文件时自动刷新浏览器.Spring Boot也提供了相 ...
- 洛谷 P6218 [USACO06NOV] Round Numbers S
洛谷 P6218 [USACO06NOV] Round Numbers S 题目描述 如果一个正整数的二进制表示中,\(0\) 的数目不小于 \(1\) 的数目,那么它就被称为「圆数」. 例如,\(9 ...
- J20航模遥控器开源项目系列教程(二)使用说明 | 遥控器制作完成了,怎么用?
我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/C ...
- MongoDB最新4.2.7版本三分片集群修改IP实操演练
背景 重新组网,需要对现有MongoDB分片集群服务器的IP进行更改,因此也需要对MongoDB分片集群的IP也进行相应的更新,而MongoDB分片集群的IP修改不能单纯的通过配置来进行,需要一番折腾 ...
- ubuntu apt-mirror 同步源到本地
1.下载 apt-mirror apt-get install apt-mirror 2.修改配置 root@wangjq:/wangjq# cat /etc/apt/mirror.list##### ...
- dcoker 小应用(二)
sudo yum install epel-release vi /etc/yum.repos.d/epel.repo use base url instead of mirror url ...
- 操作系统-PV操作的原理和几种常见问题
信号量是一种变量类型,用一个记录型数据结构表示,有两个分量:信号量的值和信号量队列指针 除了赋初值外,信号量仅能通过同步原语PV对其进行操作 s.value为正时,此值为封锁进程前对s信号量可施行的P ...